Compare commits
25 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
cdc12e513c | ||
|
ee0cea6c2b | ||
|
b2c3c09c20 | ||
|
114980dab0 | ||
|
1af1ecfbb9 | ||
|
b7c04d16b3 | ||
|
67bf71c998 | ||
|
43515d8058 | ||
|
7ed7033716 | ||
|
c4c87f34fc | ||
|
5028e0ee32 | ||
|
bf500772cb | ||
|
22fde157ba | ||
|
55fa48dbe4 | ||
|
9ba6c2a92f | ||
|
7b577ec8b8 | ||
|
78979b424b | ||
|
bd76c29f15 | ||
|
9998f9b99c | ||
|
50bf41df51 | ||
|
7af14f995c | ||
|
3c28242303 | ||
|
b443caabc5 | ||
|
50dcfcf495 | ||
|
95ececeba0 |
8
.gitignore
vendored
8
.gitignore
vendored
@ -2,3 +2,11 @@
|
||||
#/.packages
|
||||
#/.dart_tool
|
||||
#/example/ios/Podfile.lock
|
||||
build/
|
||||
.dart_tool/
|
||||
.vscode/
|
||||
.metadata
|
||||
.idea/encodings.xml
|
||||
.idea/other.xml
|
||||
windows/openlib/
|
||||
windows/third_party/
|
||||
|
186
.idea/flutter_openim_sdk.iml
generated
186
.idea/flutter_openim_sdk.iml
generated
@ -30,6 +30,192 @@
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/ios/.symlinks/plugins/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/example/windows/flutter/ephemeral/.plugin_symlinks/flutter_openim_sdk/build" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
|
44
.idea/libraries/Dart_SDK.xml
generated
44
.idea/libraries/Dart_SDK.xml
generated
@ -1,27 +1,29 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Dart SDK">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/async" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/cli" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/collection" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/convert" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/core" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/developer" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/ffi" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/html" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/indexed_db" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/io" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/isolate" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/js" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/js_interop" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/js_interop_unsafe" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/js_util" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/math" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/mirrors" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/svg" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/typed_data" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/web_audio" />
|
||||
<root url="file://$PROJECT_DIR$/../../install/flutter_sdk/bin/cache/dart-sdk/lib/web_gl" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/_internal" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/async" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/cli" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/collection" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/concurrent" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/convert" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/core" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/developer" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/ffi" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/html" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/indexed_db" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/io" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/isolate" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/js" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/js_interop" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/js_interop_unsafe" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/js_util" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/math" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/mirrors" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/svg" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/typed_data" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/web_audio" />
|
||||
<root url="file://$PROJECT_DIR$/../../../../fvm/versions/3.29.2/bin/cache/dart-sdk/lib/web_gl" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
|
3
.idea/misc.xml
generated
3
.idea/misc.xml
generated
@ -3,4 +3,7 @@
|
||||
<type id="android" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Android API 25 Platform" project-jdk-type="Android SDK" />
|
||||
<component name="ProjectType">
|
||||
<option name="id" value="io.flutter" />
|
||||
</component>
|
||||
</project>
|
@ -42,6 +42,7 @@ rootProject.allprojects {
|
||||
apply plugin: 'com.android.library'
|
||||
|
||||
android {
|
||||
namespace 'io.openim.flutter_openim_sdk'
|
||||
compileSdkVersion 34
|
||||
|
||||
defaultConfig {
|
||||
@ -57,5 +58,5 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'com.openim:sdkcore:1.0.6'
|
||||
implementation 'com.openim:sdkcore:1.0.14'
|
||||
}
|
@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="io.openim.flutter_openim_sdk">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
</manifest>
|
@ -48,7 +48,7 @@ public class MessageManager extends BaseManager {
|
||||
value(methodCall, "operationID"),
|
||||
value(methodCall, "conversationID"),
|
||||
value(methodCall, "clientMsgID"),
|
||||
value(methodCall, "content")
|
||||
jsonValue(methodCall, "message")
|
||||
);
|
||||
}
|
||||
|
||||
@ -388,6 +388,16 @@ public class MessageManager extends BaseManager {
|
||||
jsonValue(methodCall, "fileElem")));
|
||||
}
|
||||
|
||||
public void fetchSurroundingMessages(MethodCall methodCall, MethodChannel.Result result) {
|
||||
Open_im_sdk.fetchSurroundingMessages(
|
||||
new OnBaseListener(result, methodCall),
|
||||
value(methodCall, "operationID"),
|
||||
jsonValue(methodCall, "message"),
|
||||
int2long(methodCall, "before"),
|
||||
int2long(methodCall, "after"));
|
||||
}
|
||||
|
||||
|
||||
public void setCustomBusinessListener(MethodCall methodCall, MethodChannel.Result result) {
|
||||
Open_im_sdk.setCustomBusinessListener(new OnCustomBusinessListener());
|
||||
|
||||
|
@ -0,0 +1,35 @@
|
||||
package io.openim.flutter_openim_sdk
|
||||
|
||||
import androidx.annotation.NonNull
|
||||
|
||||
import io.flutter.embedding.engine.plugins.FlutterPlugin
|
||||
import io.flutter.plugin.common.MethodCall
|
||||
import io.flutter.plugin.common.MethodChannel
|
||||
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
|
||||
import io.flutter.plugin.common.MethodChannel.Result
|
||||
|
||||
/** FlutterOpenimSdkPlugin */
|
||||
class FlutterOpenimSdkPlugin: FlutterPlugin, MethodCallHandler {
|
||||
/// The MethodChannel that will the communication between Flutter and native Android
|
||||
///
|
||||
/// This local reference serves to register the plugin with the Flutter Engine and unregister it
|
||||
/// when the Flutter Engine is detached from the Activity
|
||||
private lateinit var channel : MethodChannel
|
||||
|
||||
override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
|
||||
channel = MethodChannel(flutterPluginBinding.binaryMessenger, "flutter_openim_sdk")
|
||||
channel.setMethodCallHandler(this)
|
||||
}
|
||||
|
||||
override fun onMethodCall(call: MethodCall, result: Result) {
|
||||
if (call.method == "getPlatformVersion") {
|
||||
result.success("Android ${android.os.Build.VERSION.RELEASE}")
|
||||
} else {
|
||||
result.notImplemented()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
|
||||
channel.setMethodCallHandler(null)
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package io.openim.flutter_openim_sdk
|
||||
|
||||
import io.flutter.plugin.common.MethodCall
|
||||
import io.flutter.plugin.common.MethodChannel
|
||||
import kotlin.test.Test
|
||||
import org.mockito.Mockito
|
||||
|
||||
/*
|
||||
* This demonstrates a simple unit test of the Kotlin portion of this plugin's implementation.
|
||||
*
|
||||
* Once you have built the plugin's example app, you can run these tests from the command
|
||||
* line by running `./gradlew testDebugUnitTest` in the `example/android/` directory, or
|
||||
* you can run them directly from IDEs that support JUnit such as Android Studio.
|
||||
*/
|
||||
|
||||
internal class FlutterOpenimSdkPluginTest {
|
||||
@Test
|
||||
fun onMethodCall_getPlatformVersion_returnsExpectedValue() {
|
||||
val plugin = FlutterOpenimSdkPlugin()
|
||||
|
||||
val call = MethodCall("getPlatformVersion", null)
|
||||
val mockResult: MethodChannel.Result = Mockito.mock(MethodChannel.Result::class.java)
|
||||
plugin.onMethodCall(call, mockResult)
|
||||
|
||||
Mockito.verify(mockResult).success("Android " + android.os.Build.VERSION.RELEASE)
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package io.openim.flutter_openim_sdk_example
|
||||
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
|
||||
class MainActivity: FlutterActivity()
|
22
example/integration_test/plugin_integration_test.dart
Normal file
22
example/integration_test/plugin_integration_test.dart
Normal file
@ -0,0 +1,22 @@
|
||||
// This is a basic Flutter integration test.
|
||||
//
|
||||
// Since integration tests run in a full Flutter application, they can interact
|
||||
// with the host side of a plugin implementation, unlike Dart unit tests.
|
||||
//
|
||||
// For more information about Flutter integration tests, please see
|
||||
// https://flutter.dev/to/integration-testing
|
||||
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:integration_test/integration_test.dart';
|
||||
|
||||
void main() {
|
||||
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
testWidgets('getPlatformVersion test', (WidgetTester tester) async {
|
||||
final FlutterOpenimSdk plugin = FlutterOpenimSdk();
|
||||
final String? version = await plugin.getPlatformVersion();
|
||||
// The version string depends on the host platform running the test, so
|
||||
// just assert that some non-empty string is returned.
|
||||
expect(version?.isNotEmpty, true);
|
||||
});
|
||||
}
|
29
example/ios/Podfile.lock
Normal file
29
example/ios/Podfile.lock
Normal file
@ -0,0 +1,29 @@
|
||||
PODS:
|
||||
- Flutter (1.0.0)
|
||||
- flutter_openim_sdk (0.0.1):
|
||||
- Flutter
|
||||
- OpenIMSDKCore (= 3.8.2)
|
||||
- OpenIMSDKCore (3.8.2)
|
||||
|
||||
DEPENDENCIES:
|
||||
- Flutter (from `Flutter`)
|
||||
- flutter_openim_sdk (from `.symlinks/plugins/flutter_openim_sdk/ios`)
|
||||
|
||||
SPEC REPOS:
|
||||
trunk:
|
||||
- OpenIMSDKCore
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
Flutter:
|
||||
:path: Flutter
|
||||
flutter_openim_sdk:
|
||||
:path: ".symlinks/plugins/flutter_openim_sdk/ios"
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
|
||||
flutter_openim_sdk: 77bdd08fb8dda1644a0c150b8ba7324f11b32404
|
||||
OpenIMSDKCore: aaffd63079a874d9272b8b962598723cb8128d32
|
||||
|
||||
PODFILE CHECKSUM: 819463e6a0290f5a72f145ba7cde16e8b6ef0796
|
||||
|
||||
COCOAPODS: 1.15.2
|
@ -10,10 +10,12 @@
|
||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
||||
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
|
||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
||||
3E0FE62DE2A4D4E61AC3FD02 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BB3D975831D21A8FACEF96B /* Pods_Runner.framework */; };
|
||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
||||
F32475A5B591900F07118022 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 119B0071FAB85FAD36937602 /* Pods_RunnerTests.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
@ -40,14 +42,19 @@
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
119B0071FAB85FAD36937602 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
|
||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
|
||||
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
|
||||
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
||||
4D6806EF7C87F4A8E899A73E /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
||||
5C84146D7BEE11433AA4DE9E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
|
||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
||||
7D277EA428A8FDCA196F3196 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
||||
8BB3D975831D21A8FACEF96B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
|
||||
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
|
||||
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
@ -55,13 +62,25 @@
|
||||
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
BD60456F5D1660BF5A90F9A1 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; };
|
||||
F0FFA291A8BB24B66A6DCC8C /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
FA507785CCEA4423C40C3CCD /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
1B803A0F046E9658A8FCEED0 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
F32475A5B591900F07118022 /* Pods_RunnerTests.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
97C146EB1CF9000F007C117D /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
3E0FE62DE2A4D4E61AC3FD02 /* Pods_Runner.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -76,6 +95,20 @@
|
||||
path = RunnerTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
8575235C80CAB4F7FB7F5B46 /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FA507785CCEA4423C40C3CCD /* Pods-Runner.debug.xcconfig */,
|
||||
4D6806EF7C87F4A8E899A73E /* Pods-Runner.release.xcconfig */,
|
||||
7D277EA428A8FDCA196F3196 /* Pods-Runner.profile.xcconfig */,
|
||||
F0FFA291A8BB24B66A6DCC8C /* Pods-RunnerTests.debug.xcconfig */,
|
||||
5C84146D7BEE11433AA4DE9E /* Pods-RunnerTests.release.xcconfig */,
|
||||
BD60456F5D1660BF5A90F9A1 /* Pods-RunnerTests.profile.xcconfig */,
|
||||
);
|
||||
name = Pods;
|
||||
path = Pods;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
9740EEB11CF90186004384FC /* Flutter */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -94,6 +127,8 @@
|
||||
97C146F01CF9000F007C117D /* Runner */,
|
||||
97C146EF1CF9000F007C117D /* Products */,
|
||||
331C8082294A63A400263BE5 /* RunnerTests */,
|
||||
8575235C80CAB4F7FB7F5B46 /* Pods */,
|
||||
B94289CF044A7671B3BECB8E /* Frameworks */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@ -121,6 +156,15 @@
|
||||
path = Runner;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B94289CF044A7671B3BECB8E /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8BB3D975831D21A8FACEF96B /* Pods_Runner.framework */,
|
||||
119B0071FAB85FAD36937602 /* Pods_RunnerTests.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
@ -128,8 +172,10 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
|
||||
buildPhases = (
|
||||
70DBF52745AF25A4FC72D8C3 /* [CP] Check Pods Manifest.lock */,
|
||||
331C807D294A63A400263BE5 /* Sources */,
|
||||
331C807F294A63A400263BE5 /* Resources */,
|
||||
1B803A0F046E9658A8FCEED0 /* Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@ -145,6 +191,7 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
||||
buildPhases = (
|
||||
3DCEC8459668E43AE9B4C8D5 /* [CP] Check Pods Manifest.lock */,
|
||||
9740EEB61CF901F6004384FC /* Run Script */,
|
||||
97C146EA1CF9000F007C117D /* Sources */,
|
||||
97C146EB1CF9000F007C117D /* Frameworks */,
|
||||
@ -238,6 +285,50 @@
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
|
||||
};
|
||||
3DCEC8459668E43AE9B4C8D5 /* [CP] Check Pods Manifest.lock */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputFileListPaths = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||
"${PODS_ROOT}/Manifest.lock",
|
||||
);
|
||||
name = "[CP] Check Pods Manifest.lock";
|
||||
outputFileListPaths = (
|
||||
);
|
||||
outputPaths = (
|
||||
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
70DBF52745AF25A4FC72D8C3 /* [CP] Check Pods Manifest.lock */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputFileListPaths = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||
"${PODS_ROOT}/Manifest.lock",
|
||||
);
|
||||
name = "[CP] Check Pods Manifest.lock";
|
||||
outputFileListPaths = (
|
||||
);
|
||||
outputPaths = (
|
||||
"$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
9740EEB61CF901F6004384FC /* Run Script */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
@ -379,6 +470,7 @@
|
||||
};
|
||||
331C8088294A63A400263BE5 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = F0FFA291A8BB24B66A6DCC8C /* Pods-RunnerTests.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
@ -396,6 +488,7 @@
|
||||
};
|
||||
331C8089294A63A400263BE5 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 5C84146D7BEE11433AA4DE9E /* Pods-RunnerTests.release.xcconfig */;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
@ -411,6 +504,7 @@
|
||||
};
|
||||
331C808A294A63A400263BE5 /* Profile */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = BD60456F5D1660BF5A90F9A1 /* Pods-RunnerTests.profile.xcconfig */;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
|
@ -4,4 +4,7 @@
|
||||
<FileRef
|
||||
location = "group:Runner.xcodeproj">
|
||||
</FileRef>
|
||||
<FileRef
|
||||
location = "group:Pods/Pods.xcodeproj">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
|
@ -1,7 +1,7 @@
|
||||
import Flutter
|
||||
import UIKit
|
||||
|
||||
@UIApplicationMain
|
||||
@main
|
||||
@objc class AppDelegate: FlutterAppDelegate {
|
||||
override func application(
|
||||
_ application: UIApplication,
|
||||
|
@ -2,24 +2,64 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
|
||||
|
||||
void main() {
|
||||
runApp(MyApp());
|
||||
try {
|
||||
runApp(const MyApp());
|
||||
} catch (e, stackTrace) {
|
||||
print('Error during app startup: $e');
|
||||
print('Stack trace: $stackTrace');
|
||||
}
|
||||
}
|
||||
|
||||
class MyApp extends StatefulWidget {
|
||||
const MyApp({super.key});
|
||||
|
||||
@override
|
||||
_MyAppState createState() => _MyAppState();
|
||||
}
|
||||
|
||||
class _MyAppState extends State<MyApp> {
|
||||
Future<void> send() async {
|
||||
OpenIM.iMManager.messageManager
|
||||
.sendMessage(
|
||||
userID: "724f91aceb434a28a1cd10f5564b2c68",
|
||||
message: await OpenIM.iMManager.messageManager
|
||||
.createTextMessage(text: 'hello openim'),
|
||||
offlinePushInfo: OfflinePushInfo(title: 'title', desc: 'desc'))
|
||||
.then((value) {
|
||||
print('send success');
|
||||
}).catchError((error) {
|
||||
print('send error');
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
OpenIM.iMManager.initSDK(
|
||||
platformID: 1,
|
||||
apiAddr: '',
|
||||
wsAddr: '',
|
||||
dataDir: '/',
|
||||
listener: OnConnectListener());
|
||||
OpenIM.iMManager
|
||||
.initSDK(
|
||||
platformID: 3,
|
||||
apiAddr: 'http://192.168.77.135:10002',
|
||||
wsAddr: 'ws://192.168.77.135:10001',
|
||||
dataDir: './',
|
||||
listener: OnConnectListener())
|
||||
.then((value) {});
|
||||
OpenIM.iMManager.userManager.setUserListener(OnUserListener());
|
||||
|
||||
OpenIM.iMManager
|
||||
.login(
|
||||
userID: "8bfe13b5eac44e87963652abb91d80d2",
|
||||
token:
|
||||
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOiI4YmZlMTNiNWVhYzQ0ZTg3OTYzNjUyYWJiOTFkODBkMiIsIlBsYXRmb3JtSUQiOjMsImV4cCI6MTc1NDM2NDkwNCwiaWF0IjoxNzQ2NTg4ODk5fQ.575xwR9lzJo1i5Te-Ul-99odONfxbzDXW0_2Kv3nFEE")
|
||||
.then((value) {
|
||||
List<String> list = [];
|
||||
OpenIM.iMManager.userManager.subscribeUsersStatus(list);
|
||||
send();
|
||||
OpenIM.iMManager.conversationManager
|
||||
.getAllConversationList()
|
||||
.then((value) {
|
||||
print('Get all conversation list successful');
|
||||
});
|
||||
}).catchError((error) {});
|
||||
}
|
||||
|
||||
@override
|
||||
@ -31,7 +71,7 @@ class _MyAppState extends State<MyApp> {
|
||||
),
|
||||
body: Column(
|
||||
children: [
|
||||
TextButton(onPressed: () {}, child: Text('login')),
|
||||
TextButton(onPressed: () {}, child: const Text('login')),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
@ -76,7 +76,7 @@ packages:
|
||||
path: ".."
|
||||
relative: true
|
||||
source: path
|
||||
version: "3.8.1+1"
|
||||
version: "3.8.3+2"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
@ -86,18 +86,18 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker
|
||||
sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
|
||||
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "10.0.4"
|
||||
version: "10.0.5"
|
||||
leak_tracker_flutter_testing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker_flutter_testing
|
||||
sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
|
||||
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.3"
|
||||
version: "3.0.5"
|
||||
leak_tracker_testing:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -126,18 +126,18 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: material_color_utilities
|
||||
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
|
||||
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.8.0"
|
||||
version: "0.11.1"
|
||||
meta:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
|
||||
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.12.0"
|
||||
version: "1.15.0"
|
||||
path:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -195,10 +195,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
|
||||
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.0"
|
||||
version: "0.7.2"
|
||||
vector_math:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -211,10 +211,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vm_service
|
||||
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
|
||||
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "14.2.1"
|
||||
version: "14.2.5"
|
||||
sdks:
|
||||
dart: ">=3.4.4 <4.0.0"
|
||||
flutter: ">=3.18.0-18.0.pre.54"
|
||||
|
@ -13,7 +13,7 @@ import 'package:flutter_openim_sdk_example/main.dart';
|
||||
void main() {
|
||||
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
|
||||
// Build our app and trigger a frame.
|
||||
await tester.pumpWidget(MyApp());
|
||||
await tester.pumpWidget(const MyApp());
|
||||
|
||||
// Verify that our counter starts at 0.
|
||||
expect(find.text('0'), findsOneWidget);
|
||||
|
17
example/windows/.gitignore
vendored
Normal file
17
example/windows/.gitignore
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
flutter/ephemeral/
|
||||
|
||||
# Visual Studio user-specific files.
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# Visual Studio build-related files.
|
||||
x64/
|
||||
x86/
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!*.[Cc]ache/
|
110
example/windows/CMakeLists.txt
Normal file
110
example/windows/CMakeLists.txt
Normal file
@ -0,0 +1,110 @@
|
||||
# Project-level configuration.
|
||||
cmake_minimum_required(VERSION 3.14)
|
||||
project(flutter_openim_sdk_example LANGUAGES CXX)
|
||||
|
||||
# The name of the executable created for the application. Change this to change
|
||||
# the on-disk name of your application.
|
||||
set(BINARY_NAME "flutter_openim_sdk_example")
|
||||
|
||||
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
|
||||
# versions of CMake.
|
||||
cmake_policy(VERSION 3.14...3.25)
|
||||
|
||||
# Define build configuration option.
|
||||
get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||
if(IS_MULTICONFIG)
|
||||
set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release"
|
||||
CACHE STRING "" FORCE)
|
||||
else()
|
||||
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||
set(CMAKE_BUILD_TYPE "Debug" CACHE
|
||||
STRING "Flutter build mode" FORCE)
|
||||
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
|
||||
"Debug" "Profile" "Release")
|
||||
endif()
|
||||
endif()
|
||||
# Define settings for the Profile build mode.
|
||||
set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}")
|
||||
set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}")
|
||||
set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}")
|
||||
|
||||
# Use Unicode for all projects.
|
||||
add_definitions(-DUNICODE -D_UNICODE)
|
||||
|
||||
# Compilation settings that should be applied to most targets.
|
||||
#
|
||||
# Be cautious about adding new options here, as plugins use this function by
|
||||
# default. In most cases, you should add new options to specific targets instead
|
||||
# of modifying this function.
|
||||
function(APPLY_STANDARD_SETTINGS TARGET)
|
||||
target_compile_features(${TARGET} PUBLIC cxx_std_17)
|
||||
target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100")
|
||||
target_compile_options(${TARGET} PRIVATE /EHsc)
|
||||
target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0")
|
||||
target_compile_definitions(${TARGET} PRIVATE "$<$<CONFIG:Debug>:_DEBUG>")
|
||||
endfunction()
|
||||
|
||||
# Flutter library and tool build rules.
|
||||
set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
|
||||
add_subdirectory(${FLUTTER_MANAGED_DIR})
|
||||
|
||||
# Application build; see runner/CMakeLists.txt.
|
||||
add_subdirectory("runner")
|
||||
|
||||
# Enable the test target.
|
||||
set(include_flutter_openim_sdk_tests TRUE)
|
||||
|
||||
# Generated plugin build rules, which manage building the plugins and adding
|
||||
# them to the application.
|
||||
include(flutter/generated_plugins.cmake)
|
||||
|
||||
|
||||
# === Installation ===
|
||||
# Support files are copied into place next to the executable, so that it can
|
||||
# run in place. This is done instead of making a separate bundle (as on Linux)
|
||||
# so that building and running from within Visual Studio will work.
|
||||
set(BUILD_BUNDLE_DIR "$<TARGET_FILE_DIR:${BINARY_NAME}>")
|
||||
# Make the "install" step default, as it's required to run.
|
||||
set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)
|
||||
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
||||
set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
|
||||
endif()
|
||||
|
||||
set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
|
||||
set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}")
|
||||
|
||||
install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
|
||||
COMPONENT Runtime)
|
||||
|
||||
install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
|
||||
COMPONENT Runtime)
|
||||
|
||||
install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
|
||||
COMPONENT Runtime)
|
||||
|
||||
if(PLUGIN_BUNDLED_LIBRARIES)
|
||||
install(FILES "${PLUGIN_BUNDLED_LIBRARIES}"
|
||||
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
|
||||
COMPONENT Runtime)
|
||||
endif()
|
||||
|
||||
# Copy the native assets provided by the build.dart from all packages.
|
||||
set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/")
|
||||
install(DIRECTORY "${NATIVE_ASSETS_DIR}"
|
||||
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
|
||||
COMPONENT Runtime)
|
||||
|
||||
# Fully re-copy the assets directory on each build to avoid having stale files
|
||||
# from a previous install.
|
||||
set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
|
||||
install(CODE "
|
||||
file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
|
||||
" COMPONENT Runtime)
|
||||
install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
|
||||
DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
|
||||
|
||||
# Install the AOT library on non-Debug builds only.
|
||||
install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
|
||||
CONFIGURATIONS Profile;Release
|
||||
COMPONENT Runtime)
|
109
example/windows/flutter/CMakeLists.txt
Normal file
109
example/windows/flutter/CMakeLists.txt
Normal file
@ -0,0 +1,109 @@
|
||||
# This file controls Flutter-level build steps. It should not be edited.
|
||||
cmake_minimum_required(VERSION 3.14)
|
||||
|
||||
set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
|
||||
|
||||
# Configuration provided via flutter tool.
|
||||
include(${EPHEMERAL_DIR}/generated_config.cmake)
|
||||
|
||||
# TODO: Move the rest of this into files in ephemeral. See
|
||||
# https://github.com/flutter/flutter/issues/57146.
|
||||
set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper")
|
||||
|
||||
# Set fallback configurations for older versions of the flutter tool.
|
||||
if (NOT DEFINED FLUTTER_TARGET_PLATFORM)
|
||||
set(FLUTTER_TARGET_PLATFORM "windows-x64")
|
||||
endif()
|
||||
|
||||
# === Flutter Library ===
|
||||
set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll")
|
||||
|
||||
# Published to parent scope for install step.
|
||||
set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)
|
||||
set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE)
|
||||
set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE)
|
||||
set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE)
|
||||
|
||||
list(APPEND FLUTTER_LIBRARY_HEADERS
|
||||
"flutter_export.h"
|
||||
"flutter_windows.h"
|
||||
"flutter_messenger.h"
|
||||
"flutter_plugin_registrar.h"
|
||||
"flutter_texture_registrar.h"
|
||||
)
|
||||
list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/")
|
||||
add_library(flutter INTERFACE)
|
||||
target_include_directories(flutter INTERFACE
|
||||
"${EPHEMERAL_DIR}"
|
||||
)
|
||||
target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib")
|
||||
add_dependencies(flutter flutter_assemble)
|
||||
|
||||
# === Wrapper ===
|
||||
list(APPEND CPP_WRAPPER_SOURCES_CORE
|
||||
"core_implementations.cc"
|
||||
"standard_codec.cc"
|
||||
)
|
||||
list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/")
|
||||
list(APPEND CPP_WRAPPER_SOURCES_PLUGIN
|
||||
"plugin_registrar.cc"
|
||||
)
|
||||
list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/")
|
||||
list(APPEND CPP_WRAPPER_SOURCES_APP
|
||||
"flutter_engine.cc"
|
||||
"flutter_view_controller.cc"
|
||||
)
|
||||
list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/")
|
||||
|
||||
# Wrapper sources needed for a plugin.
|
||||
add_library(flutter_wrapper_plugin STATIC
|
||||
${CPP_WRAPPER_SOURCES_CORE}
|
||||
${CPP_WRAPPER_SOURCES_PLUGIN}
|
||||
)
|
||||
apply_standard_settings(flutter_wrapper_plugin)
|
||||
set_target_properties(flutter_wrapper_plugin PROPERTIES
|
||||
POSITION_INDEPENDENT_CODE ON)
|
||||
set_target_properties(flutter_wrapper_plugin PROPERTIES
|
||||
CXX_VISIBILITY_PRESET hidden)
|
||||
target_link_libraries(flutter_wrapper_plugin PUBLIC flutter)
|
||||
target_include_directories(flutter_wrapper_plugin PUBLIC
|
||||
"${WRAPPER_ROOT}/include"
|
||||
)
|
||||
add_dependencies(flutter_wrapper_plugin flutter_assemble)
|
||||
|
||||
# Wrapper sources needed for the runner.
|
||||
add_library(flutter_wrapper_app STATIC
|
||||
${CPP_WRAPPER_SOURCES_CORE}
|
||||
${CPP_WRAPPER_SOURCES_APP}
|
||||
)
|
||||
apply_standard_settings(flutter_wrapper_app)
|
||||
target_link_libraries(flutter_wrapper_app PUBLIC flutter)
|
||||
target_include_directories(flutter_wrapper_app PUBLIC
|
||||
"${WRAPPER_ROOT}/include"
|
||||
)
|
||||
add_dependencies(flutter_wrapper_app flutter_assemble)
|
||||
|
||||
# === Flutter tool backend ===
|
||||
# _phony_ is a non-existent file to force this command to run every time,
|
||||
# since currently there's no way to get a full input/output list from the
|
||||
# flutter tool.
|
||||
set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_")
|
||||
set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE)
|
||||
add_custom_command(
|
||||
OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
|
||||
${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN}
|
||||
${CPP_WRAPPER_SOURCES_APP}
|
||||
${PHONY_OUTPUT}
|
||||
COMMAND ${CMAKE_COMMAND} -E env
|
||||
${FLUTTER_TOOL_ENVIRONMENT}
|
||||
"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"
|
||||
${FLUTTER_TARGET_PLATFORM} $<CONFIG>
|
||||
VERBATIM
|
||||
)
|
||||
add_custom_target(flutter_assemble DEPENDS
|
||||
"${FLUTTER_LIBRARY}"
|
||||
${FLUTTER_LIBRARY_HEADERS}
|
||||
${CPP_WRAPPER_SOURCES_CORE}
|
||||
${CPP_WRAPPER_SOURCES_PLUGIN}
|
||||
${CPP_WRAPPER_SOURCES_APP}
|
||||
)
|
14
example/windows/flutter/generated_plugin_registrant.cc
Normal file
14
example/windows/flutter/generated_plugin_registrant.cc
Normal file
@ -0,0 +1,14 @@
|
||||
//
|
||||
// Generated file. Do not edit.
|
||||
//
|
||||
|
||||
// clang-format off
|
||||
|
||||
#include "generated_plugin_registrant.h"
|
||||
|
||||
#include <flutter_openim_sdk/flutter_openim_sdk_plugin.h>
|
||||
|
||||
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||
FlutterOpenimSdkPluginRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("FlutterOpenimSdkPlugin"));
|
||||
}
|
15
example/windows/flutter/generated_plugin_registrant.h
Normal file
15
example/windows/flutter/generated_plugin_registrant.h
Normal file
@ -0,0 +1,15 @@
|
||||
//
|
||||
// Generated file. Do not edit.
|
||||
//
|
||||
|
||||
// clang-format off
|
||||
|
||||
#ifndef GENERATED_PLUGIN_REGISTRANT_
|
||||
#define GENERATED_PLUGIN_REGISTRANT_
|
||||
|
||||
#include <flutter/plugin_registry.h>
|
||||
|
||||
// Registers Flutter plugins.
|
||||
void RegisterPlugins(flutter::PluginRegistry* registry);
|
||||
|
||||
#endif // GENERATED_PLUGIN_REGISTRANT_
|
24
example/windows/flutter/generated_plugins.cmake
Normal file
24
example/windows/flutter/generated_plugins.cmake
Normal file
@ -0,0 +1,24 @@
|
||||
#
|
||||
# Generated file, do not edit.
|
||||
#
|
||||
|
||||
list(APPEND FLUTTER_PLUGIN_LIST
|
||||
flutter_openim_sdk
|
||||
)
|
||||
|
||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||
)
|
||||
|
||||
set(PLUGIN_BUNDLED_LIBRARIES)
|
||||
|
||||
foreach(plugin ${FLUTTER_PLUGIN_LIST})
|
||||
add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin})
|
||||
target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)
|
||||
list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)
|
||||
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
|
||||
endforeach(plugin)
|
||||
|
||||
foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
|
||||
add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin})
|
||||
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
|
||||
endforeach(ffi_plugin)
|
40
example/windows/runner/CMakeLists.txt
Normal file
40
example/windows/runner/CMakeLists.txt
Normal file
@ -0,0 +1,40 @@
|
||||
cmake_minimum_required(VERSION 3.14)
|
||||
project(runner LANGUAGES CXX)
|
||||
|
||||
# Define the application target. To change its name, change BINARY_NAME in the
|
||||
# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer
|
||||
# work.
|
||||
#
|
||||
# Any new source files that you add to the application should be added here.
|
||||
add_executable(${BINARY_NAME} WIN32
|
||||
"flutter_window.cpp"
|
||||
"main.cpp"
|
||||
"utils.cpp"
|
||||
"win32_window.cpp"
|
||||
"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
|
||||
"Runner.rc"
|
||||
"runner.exe.manifest"
|
||||
)
|
||||
|
||||
# Apply the standard set of build settings. This can be removed for applications
|
||||
# that need different build settings.
|
||||
apply_standard_settings(${BINARY_NAME})
|
||||
|
||||
# Add preprocessor definitions for the build version.
|
||||
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"")
|
||||
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}")
|
||||
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}")
|
||||
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}")
|
||||
target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}")
|
||||
|
||||
# Disable Windows macros that collide with C++ standard library functions.
|
||||
target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX")
|
||||
|
||||
# Add dependency libraries and include directories. Add any application-specific
|
||||
# dependencies here.
|
||||
target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)
|
||||
target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib")
|
||||
target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}")
|
||||
|
||||
# Run the Flutter tool portions of the build. This must not be removed.
|
||||
add_dependencies(${BINARY_NAME} flutter_assemble)
|
121
example/windows/runner/Runner.rc
Normal file
121
example/windows/runner/Runner.rc
Normal file
@ -0,0 +1,121 @@
|
||||
// Microsoft Visual C++ generated resource script.
|
||||
//
|
||||
#pragma code_page(65001)
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "winres.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (United States) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE
|
||||
BEGIN
|
||||
"#include ""winres.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Icon
|
||||
//
|
||||
|
||||
// Icon with lowest ID value placed first to ensure application icon
|
||||
// remains consistent on all systems.
|
||||
IDI_APP_ICON ICON "resources\\app_icon.ico"
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Version
|
||||
//
|
||||
|
||||
#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD)
|
||||
#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD
|
||||
#else
|
||||
#define VERSION_AS_NUMBER 1,0,0,0
|
||||
#endif
|
||||
|
||||
#if defined(FLUTTER_VERSION)
|
||||
#define VERSION_AS_STRING FLUTTER_VERSION
|
||||
#else
|
||||
#define VERSION_AS_STRING "1.0.0"
|
||||
#endif
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION VERSION_AS_NUMBER
|
||||
PRODUCTVERSION VERSION_AS_NUMBER
|
||||
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS VS_FF_DEBUG
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS VOS__WINDOWS32
|
||||
FILETYPE VFT_APP
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904e4"
|
||||
BEGIN
|
||||
VALUE "CompanyName", "io.openim" "\0"
|
||||
VALUE "FileDescription", "flutter_openim_sdk_example" "\0"
|
||||
VALUE "FileVersion", VERSION_AS_STRING "\0"
|
||||
VALUE "InternalName", "flutter_openim_sdk_example" "\0"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2025 io.openim. All rights reserved." "\0"
|
||||
VALUE "OriginalFilename", "flutter_openim_sdk_example.exe" "\0"
|
||||
VALUE "ProductName", "flutter_openim_sdk_example" "\0"
|
||||
VALUE "ProductVersion", VERSION_AS_STRING "\0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1252
|
||||
END
|
||||
END
|
||||
|
||||
#endif // English (United States) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
71
example/windows/runner/flutter_window.cpp
Normal file
71
example/windows/runner/flutter_window.cpp
Normal file
@ -0,0 +1,71 @@
|
||||
#include "flutter_window.h"
|
||||
|
||||
#include <optional>
|
||||
|
||||
#include "flutter/generated_plugin_registrant.h"
|
||||
|
||||
FlutterWindow::FlutterWindow(const flutter::DartProject& project)
|
||||
: project_(project) {}
|
||||
|
||||
FlutterWindow::~FlutterWindow() {}
|
||||
|
||||
bool FlutterWindow::OnCreate() {
|
||||
if (!Win32Window::OnCreate()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
RECT frame = GetClientArea();
|
||||
|
||||
// The size here must match the window dimensions to avoid unnecessary surface
|
||||
// creation / destruction in the startup path.
|
||||
flutter_controller_ = std::make_unique<flutter::FlutterViewController>(
|
||||
frame.right - frame.left, frame.bottom - frame.top, project_);
|
||||
// Ensure that basic setup of the controller was successful.
|
||||
if (!flutter_controller_->engine() || !flutter_controller_->view()) {
|
||||
return false;
|
||||
}
|
||||
RegisterPlugins(flutter_controller_->engine());
|
||||
SetChildContent(flutter_controller_->view()->GetNativeWindow());
|
||||
|
||||
flutter_controller_->engine()->SetNextFrameCallback([&]() {
|
||||
this->Show();
|
||||
});
|
||||
|
||||
// Flutter can complete the first frame before the "show window" callback is
|
||||
// registered. The following call ensures a frame is pending to ensure the
|
||||
// window is shown. It is a no-op if the first frame hasn't completed yet.
|
||||
flutter_controller_->ForceRedraw();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void FlutterWindow::OnDestroy() {
|
||||
if (flutter_controller_) {
|
||||
flutter_controller_ = nullptr;
|
||||
}
|
||||
|
||||
Win32Window::OnDestroy();
|
||||
}
|
||||
|
||||
LRESULT
|
||||
FlutterWindow::MessageHandler(HWND hwnd, UINT const message,
|
||||
WPARAM const wparam,
|
||||
LPARAM const lparam) noexcept {
|
||||
// Give Flutter, including plugins, an opportunity to handle window messages.
|
||||
if (flutter_controller_) {
|
||||
std::optional<LRESULT> result =
|
||||
flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam,
|
||||
lparam);
|
||||
if (result) {
|
||||
return *result;
|
||||
}
|
||||
}
|
||||
|
||||
switch (message) {
|
||||
case WM_FONTCHANGE:
|
||||
flutter_controller_->engine()->ReloadSystemFonts();
|
||||
break;
|
||||
}
|
||||
|
||||
return Win32Window::MessageHandler(hwnd, message, wparam, lparam);
|
||||
}
|
33
example/windows/runner/flutter_window.h
Normal file
33
example/windows/runner/flutter_window.h
Normal file
@ -0,0 +1,33 @@
|
||||
#ifndef RUNNER_FLUTTER_WINDOW_H_
|
||||
#define RUNNER_FLUTTER_WINDOW_H_
|
||||
|
||||
#include <flutter/dart_project.h>
|
||||
#include <flutter/flutter_view_controller.h>
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "win32_window.h"
|
||||
|
||||
// A window that does nothing but host a Flutter view.
|
||||
class FlutterWindow : public Win32Window {
|
||||
public:
|
||||
// Creates a new FlutterWindow hosting a Flutter view running |project|.
|
||||
explicit FlutterWindow(const flutter::DartProject& project);
|
||||
virtual ~FlutterWindow();
|
||||
|
||||
protected:
|
||||
// Win32Window:
|
||||
bool OnCreate() override;
|
||||
void OnDestroy() override;
|
||||
LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam,
|
||||
LPARAM const lparam) noexcept override;
|
||||
|
||||
private:
|
||||
// The project to run.
|
||||
flutter::DartProject project_;
|
||||
|
||||
// The Flutter instance hosted by this window.
|
||||
std::unique_ptr<flutter::FlutterViewController> flutter_controller_;
|
||||
};
|
||||
|
||||
#endif // RUNNER_FLUTTER_WINDOW_H_
|
43
example/windows/runner/main.cpp
Normal file
43
example/windows/runner/main.cpp
Normal file
@ -0,0 +1,43 @@
|
||||
#include <flutter/dart_project.h>
|
||||
#include <flutter/flutter_view_controller.h>
|
||||
#include <windows.h>
|
||||
|
||||
#include "flutter_window.h"
|
||||
#include "utils.h"
|
||||
|
||||
int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
|
||||
_In_ wchar_t *command_line, _In_ int show_command) {
|
||||
// Attach to console when present (e.g., 'flutter run') or create a
|
||||
// new console when running with a debugger.
|
||||
if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {
|
||||
CreateAndAttachConsole();
|
||||
}
|
||||
|
||||
// Initialize COM, so that it is available for use in the library and/or
|
||||
// plugins.
|
||||
::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
|
||||
|
||||
flutter::DartProject project(L"data");
|
||||
|
||||
std::vector<std::string> command_line_arguments =
|
||||
GetCommandLineArguments();
|
||||
|
||||
project.set_dart_entrypoint_arguments(std::move(command_line_arguments));
|
||||
|
||||
FlutterWindow window(project);
|
||||
Win32Window::Point origin(10, 10);
|
||||
Win32Window::Size size(1280, 720);
|
||||
if (!window.Create(L"flutter_openim_sdk_example", origin, size)) {
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
window.SetQuitOnClose(true);
|
||||
|
||||
::MSG msg;
|
||||
while (::GetMessage(&msg, nullptr, 0, 0)) {
|
||||
::TranslateMessage(&msg);
|
||||
::DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
::CoUninitialize();
|
||||
return EXIT_SUCCESS;
|
||||
}
|
16
example/windows/runner/resource.h
Normal file
16
example/windows/runner/resource.h
Normal file
@ -0,0 +1,16 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by Runner.rc
|
||||
//
|
||||
#define IDI_APP_ICON 101
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 102
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1001
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
BIN
example/windows/runner/resources/app_icon.ico
Normal file
BIN
example/windows/runner/resources/app_icon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
14
example/windows/runner/runner.exe.manifest
Normal file
14
example/windows/runner/runner.exe.manifest
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
<application xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<windowsSettings>
|
||||
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
|
||||
</windowsSettings>
|
||||
</application>
|
||||
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||
<application>
|
||||
<!-- Windows 10 and Windows 11 -->
|
||||
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
|
||||
</application>
|
||||
</compatibility>
|
||||
</assembly>
|
65
example/windows/runner/utils.cpp
Normal file
65
example/windows/runner/utils.cpp
Normal file
@ -0,0 +1,65 @@
|
||||
#include "utils.h"
|
||||
|
||||
#include <flutter_windows.h>
|
||||
#include <io.h>
|
||||
#include <stdio.h>
|
||||
#include <windows.h>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
void CreateAndAttachConsole() {
|
||||
if (::AllocConsole()) {
|
||||
FILE *unused;
|
||||
if (freopen_s(&unused, "CONOUT$", "w", stdout)) {
|
||||
_dup2(_fileno(stdout), 1);
|
||||
}
|
||||
if (freopen_s(&unused, "CONOUT$", "w", stderr)) {
|
||||
_dup2(_fileno(stdout), 2);
|
||||
}
|
||||
std::ios::sync_with_stdio();
|
||||
FlutterDesktopResyncOutputStreams();
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<std::string> GetCommandLineArguments() {
|
||||
// Convert the UTF-16 command line arguments to UTF-8 for the Engine to use.
|
||||
int argc;
|
||||
wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);
|
||||
if (argv == nullptr) {
|
||||
return std::vector<std::string>();
|
||||
}
|
||||
|
||||
std::vector<std::string> command_line_arguments;
|
||||
|
||||
// Skip the first argument as it's the binary name.
|
||||
for (int i = 1; i < argc; i++) {
|
||||
command_line_arguments.push_back(Utf8FromUtf16(argv[i]));
|
||||
}
|
||||
|
||||
::LocalFree(argv);
|
||||
|
||||
return command_line_arguments;
|
||||
}
|
||||
|
||||
std::string Utf8FromUtf16(const wchar_t* utf16_string) {
|
||||
if (utf16_string == nullptr) {
|
||||
return std::string();
|
||||
}
|
||||
unsigned int target_length = ::WideCharToMultiByte(
|
||||
CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
|
||||
-1, nullptr, 0, nullptr, nullptr)
|
||||
-1; // remove the trailing null character
|
||||
int input_length = (int)wcslen(utf16_string);
|
||||
std::string utf8_string;
|
||||
if (target_length == 0 || target_length > utf8_string.max_size()) {
|
||||
return utf8_string;
|
||||
}
|
||||
utf8_string.resize(target_length);
|
||||
int converted_length = ::WideCharToMultiByte(
|
||||
CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
|
||||
input_length, utf8_string.data(), target_length, nullptr, nullptr);
|
||||
if (converted_length == 0) {
|
||||
return std::string();
|
||||
}
|
||||
return utf8_string;
|
||||
}
|
19
example/windows/runner/utils.h
Normal file
19
example/windows/runner/utils.h
Normal file
@ -0,0 +1,19 @@
|
||||
#ifndef RUNNER_UTILS_H_
|
||||
#define RUNNER_UTILS_H_
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
// Creates a console for the process, and redirects stdout and stderr to
|
||||
// it for both the runner and the Flutter library.
|
||||
void CreateAndAttachConsole();
|
||||
|
||||
// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string
|
||||
// encoded in UTF-8. Returns an empty std::string on failure.
|
||||
std::string Utf8FromUtf16(const wchar_t* utf16_string);
|
||||
|
||||
// Gets the command line arguments passed in as a std::vector<std::string>,
|
||||
// encoded in UTF-8. Returns an empty std::vector<std::string> on failure.
|
||||
std::vector<std::string> GetCommandLineArguments();
|
||||
|
||||
#endif // RUNNER_UTILS_H_
|
288
example/windows/runner/win32_window.cpp
Normal file
288
example/windows/runner/win32_window.cpp
Normal file
@ -0,0 +1,288 @@
|
||||
#include "win32_window.h"
|
||||
|
||||
#include <dwmapi.h>
|
||||
#include <flutter_windows.h>
|
||||
|
||||
#include "resource.h"
|
||||
|
||||
namespace {
|
||||
|
||||
/// Window attribute that enables dark mode window decorations.
|
||||
///
|
||||
/// Redefined in case the developer's machine has a Windows SDK older than
|
||||
/// version 10.0.22000.0.
|
||||
/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute
|
||||
#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE
|
||||
#define DWMWA_USE_IMMERSIVE_DARK_MODE 20
|
||||
#endif
|
||||
|
||||
constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW";
|
||||
|
||||
/// Registry key for app theme preference.
|
||||
///
|
||||
/// A value of 0 indicates apps should use dark mode. A non-zero or missing
|
||||
/// value indicates apps should use light mode.
|
||||
constexpr const wchar_t kGetPreferredBrightnessRegKey[] =
|
||||
L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize";
|
||||
constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme";
|
||||
|
||||
// The number of Win32Window objects that currently exist.
|
||||
static int g_active_window_count = 0;
|
||||
|
||||
using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd);
|
||||
|
||||
// Scale helper to convert logical scaler values to physical using passed in
|
||||
// scale factor
|
||||
int Scale(int source, double scale_factor) {
|
||||
return static_cast<int>(source * scale_factor);
|
||||
}
|
||||
|
||||
// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module.
|
||||
// This API is only needed for PerMonitor V1 awareness mode.
|
||||
void EnableFullDpiSupportIfAvailable(HWND hwnd) {
|
||||
HMODULE user32_module = LoadLibraryA("User32.dll");
|
||||
if (!user32_module) {
|
||||
return;
|
||||
}
|
||||
auto enable_non_client_dpi_scaling =
|
||||
reinterpret_cast<EnableNonClientDpiScaling*>(
|
||||
GetProcAddress(user32_module, "EnableNonClientDpiScaling"));
|
||||
if (enable_non_client_dpi_scaling != nullptr) {
|
||||
enable_non_client_dpi_scaling(hwnd);
|
||||
}
|
||||
FreeLibrary(user32_module);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
// Manages the Win32Window's window class registration.
|
||||
class WindowClassRegistrar {
|
||||
public:
|
||||
~WindowClassRegistrar() = default;
|
||||
|
||||
// Returns the singleton registrar instance.
|
||||
static WindowClassRegistrar* GetInstance() {
|
||||
if (!instance_) {
|
||||
instance_ = new WindowClassRegistrar();
|
||||
}
|
||||
return instance_;
|
||||
}
|
||||
|
||||
// Returns the name of the window class, registering the class if it hasn't
|
||||
// previously been registered.
|
||||
const wchar_t* GetWindowClass();
|
||||
|
||||
// Unregisters the window class. Should only be called if there are no
|
||||
// instances of the window.
|
||||
void UnregisterWindowClass();
|
||||
|
||||
private:
|
||||
WindowClassRegistrar() = default;
|
||||
|
||||
static WindowClassRegistrar* instance_;
|
||||
|
||||
bool class_registered_ = false;
|
||||
};
|
||||
|
||||
WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr;
|
||||
|
||||
const wchar_t* WindowClassRegistrar::GetWindowClass() {
|
||||
if (!class_registered_) {
|
||||
WNDCLASS window_class{};
|
||||
window_class.hCursor = LoadCursor(nullptr, IDC_ARROW);
|
||||
window_class.lpszClassName = kWindowClassName;
|
||||
window_class.style = CS_HREDRAW | CS_VREDRAW;
|
||||
window_class.cbClsExtra = 0;
|
||||
window_class.cbWndExtra = 0;
|
||||
window_class.hInstance = GetModuleHandle(nullptr);
|
||||
window_class.hIcon =
|
||||
LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON));
|
||||
window_class.hbrBackground = 0;
|
||||
window_class.lpszMenuName = nullptr;
|
||||
window_class.lpfnWndProc = Win32Window::WndProc;
|
||||
RegisterClass(&window_class);
|
||||
class_registered_ = true;
|
||||
}
|
||||
return kWindowClassName;
|
||||
}
|
||||
|
||||
void WindowClassRegistrar::UnregisterWindowClass() {
|
||||
UnregisterClass(kWindowClassName, nullptr);
|
||||
class_registered_ = false;
|
||||
}
|
||||
|
||||
Win32Window::Win32Window() {
|
||||
++g_active_window_count;
|
||||
}
|
||||
|
||||
Win32Window::~Win32Window() {
|
||||
--g_active_window_count;
|
||||
Destroy();
|
||||
}
|
||||
|
||||
bool Win32Window::Create(const std::wstring& title,
|
||||
const Point& origin,
|
||||
const Size& size) {
|
||||
Destroy();
|
||||
|
||||
const wchar_t* window_class =
|
||||
WindowClassRegistrar::GetInstance()->GetWindowClass();
|
||||
|
||||
const POINT target_point = {static_cast<LONG>(origin.x),
|
||||
static_cast<LONG>(origin.y)};
|
||||
HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST);
|
||||
UINT dpi = FlutterDesktopGetDpiForMonitor(monitor);
|
||||
double scale_factor = dpi / 96.0;
|
||||
|
||||
HWND window = CreateWindow(
|
||||
window_class, title.c_str(), WS_OVERLAPPEDWINDOW,
|
||||
Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),
|
||||
Scale(size.width, scale_factor), Scale(size.height, scale_factor),
|
||||
nullptr, nullptr, GetModuleHandle(nullptr), this);
|
||||
|
||||
if (!window) {
|
||||
return false;
|
||||
}
|
||||
|
||||
UpdateTheme(window);
|
||||
|
||||
return OnCreate();
|
||||
}
|
||||
|
||||
bool Win32Window::Show() {
|
||||
return ShowWindow(window_handle_, SW_SHOWNORMAL);
|
||||
}
|
||||
|
||||
// static
|
||||
LRESULT CALLBACK Win32Window::WndProc(HWND const window,
|
||||
UINT const message,
|
||||
WPARAM const wparam,
|
||||
LPARAM const lparam) noexcept {
|
||||
if (message == WM_NCCREATE) {
|
||||
auto window_struct = reinterpret_cast<CREATESTRUCT*>(lparam);
|
||||
SetWindowLongPtr(window, GWLP_USERDATA,
|
||||
reinterpret_cast<LONG_PTR>(window_struct->lpCreateParams));
|
||||
|
||||
auto that = static_cast<Win32Window*>(window_struct->lpCreateParams);
|
||||
EnableFullDpiSupportIfAvailable(window);
|
||||
that->window_handle_ = window;
|
||||
} else if (Win32Window* that = GetThisFromHandle(window)) {
|
||||
return that->MessageHandler(window, message, wparam, lparam);
|
||||
}
|
||||
|
||||
return DefWindowProc(window, message, wparam, lparam);
|
||||
}
|
||||
|
||||
LRESULT
|
||||
Win32Window::MessageHandler(HWND hwnd,
|
||||
UINT const message,
|
||||
WPARAM const wparam,
|
||||
LPARAM const lparam) noexcept {
|
||||
switch (message) {
|
||||
case WM_DESTROY:
|
||||
window_handle_ = nullptr;
|
||||
Destroy();
|
||||
if (quit_on_close_) {
|
||||
PostQuitMessage(0);
|
||||
}
|
||||
return 0;
|
||||
|
||||
case WM_DPICHANGED: {
|
||||
auto newRectSize = reinterpret_cast<RECT*>(lparam);
|
||||
LONG newWidth = newRectSize->right - newRectSize->left;
|
||||
LONG newHeight = newRectSize->bottom - newRectSize->top;
|
||||
|
||||
SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth,
|
||||
newHeight, SWP_NOZORDER | SWP_NOACTIVATE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
case WM_SIZE: {
|
||||
RECT rect = GetClientArea();
|
||||
if (child_content_ != nullptr) {
|
||||
// Size and position the child window.
|
||||
MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left,
|
||||
rect.bottom - rect.top, TRUE);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
case WM_ACTIVATE:
|
||||
if (child_content_ != nullptr) {
|
||||
SetFocus(child_content_);
|
||||
}
|
||||
return 0;
|
||||
|
||||
case WM_DWMCOLORIZATIONCOLORCHANGED:
|
||||
UpdateTheme(hwnd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return DefWindowProc(window_handle_, message, wparam, lparam);
|
||||
}
|
||||
|
||||
void Win32Window::Destroy() {
|
||||
OnDestroy();
|
||||
|
||||
if (window_handle_) {
|
||||
DestroyWindow(window_handle_);
|
||||
window_handle_ = nullptr;
|
||||
}
|
||||
if (g_active_window_count == 0) {
|
||||
WindowClassRegistrar::GetInstance()->UnregisterWindowClass();
|
||||
}
|
||||
}
|
||||
|
||||
Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {
|
||||
return reinterpret_cast<Win32Window*>(
|
||||
GetWindowLongPtr(window, GWLP_USERDATA));
|
||||
}
|
||||
|
||||
void Win32Window::SetChildContent(HWND content) {
|
||||
child_content_ = content;
|
||||
SetParent(content, window_handle_);
|
||||
RECT frame = GetClientArea();
|
||||
|
||||
MoveWindow(content, frame.left, frame.top, frame.right - frame.left,
|
||||
frame.bottom - frame.top, true);
|
||||
|
||||
SetFocus(child_content_);
|
||||
}
|
||||
|
||||
RECT Win32Window::GetClientArea() {
|
||||
RECT frame;
|
||||
GetClientRect(window_handle_, &frame);
|
||||
return frame;
|
||||
}
|
||||
|
||||
HWND Win32Window::GetHandle() {
|
||||
return window_handle_;
|
||||
}
|
||||
|
||||
void Win32Window::SetQuitOnClose(bool quit_on_close) {
|
||||
quit_on_close_ = quit_on_close;
|
||||
}
|
||||
|
||||
bool Win32Window::OnCreate() {
|
||||
// No-op; provided for subclasses.
|
||||
return true;
|
||||
}
|
||||
|
||||
void Win32Window::OnDestroy() {
|
||||
// No-op; provided for subclasses.
|
||||
}
|
||||
|
||||
void Win32Window::UpdateTheme(HWND const window) {
|
||||
DWORD light_mode;
|
||||
DWORD light_mode_size = sizeof(light_mode);
|
||||
LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey,
|
||||
kGetPreferredBrightnessRegValue,
|
||||
RRF_RT_REG_DWORD, nullptr, &light_mode,
|
||||
&light_mode_size);
|
||||
|
||||
if (result == ERROR_SUCCESS) {
|
||||
BOOL enable_dark_mode = light_mode == 0;
|
||||
DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE,
|
||||
&enable_dark_mode, sizeof(enable_dark_mode));
|
||||
}
|
||||
}
|
102
example/windows/runner/win32_window.h
Normal file
102
example/windows/runner/win32_window.h
Normal file
@ -0,0 +1,102 @@
|
||||
#ifndef RUNNER_WIN32_WINDOW_H_
|
||||
#define RUNNER_WIN32_WINDOW_H_
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
// A class abstraction for a high DPI-aware Win32 Window. Intended to be
|
||||
// inherited from by classes that wish to specialize with custom
|
||||
// rendering and input handling
|
||||
class Win32Window {
|
||||
public:
|
||||
struct Point {
|
||||
unsigned int x;
|
||||
unsigned int y;
|
||||
Point(unsigned int x, unsigned int y) : x(x), y(y) {}
|
||||
};
|
||||
|
||||
struct Size {
|
||||
unsigned int width;
|
||||
unsigned int height;
|
||||
Size(unsigned int width, unsigned int height)
|
||||
: width(width), height(height) {}
|
||||
};
|
||||
|
||||
Win32Window();
|
||||
virtual ~Win32Window();
|
||||
|
||||
// Creates a win32 window with |title| that is positioned and sized using
|
||||
// |origin| and |size|. New windows are created on the default monitor. Window
|
||||
// sizes are specified to the OS in physical pixels, hence to ensure a
|
||||
// consistent size this function will scale the inputted width and height as
|
||||
// as appropriate for the default monitor. The window is invisible until
|
||||
// |Show| is called. Returns true if the window was created successfully.
|
||||
bool Create(const std::wstring& title, const Point& origin, const Size& size);
|
||||
|
||||
// Show the current window. Returns true if the window was successfully shown.
|
||||
bool Show();
|
||||
|
||||
// Release OS resources associated with window.
|
||||
void Destroy();
|
||||
|
||||
// Inserts |content| into the window tree.
|
||||
void SetChildContent(HWND content);
|
||||
|
||||
// Returns the backing Window handle to enable clients to set icon and other
|
||||
// window properties. Returns nullptr if the window has been destroyed.
|
||||
HWND GetHandle();
|
||||
|
||||
// If true, closing this window will quit the application.
|
||||
void SetQuitOnClose(bool quit_on_close);
|
||||
|
||||
// Return a RECT representing the bounds of the current client area.
|
||||
RECT GetClientArea();
|
||||
|
||||
protected:
|
||||
// Processes and route salient window messages for mouse handling,
|
||||
// size change and DPI. Delegates handling of these to member overloads that
|
||||
// inheriting classes can handle.
|
||||
virtual LRESULT MessageHandler(HWND window,
|
||||
UINT const message,
|
||||
WPARAM const wparam,
|
||||
LPARAM const lparam) noexcept;
|
||||
|
||||
// Called when CreateAndShow is called, allowing subclass window-related
|
||||
// setup. Subclasses should return false if setup fails.
|
||||
virtual bool OnCreate();
|
||||
|
||||
// Called when Destroy is called.
|
||||
virtual void OnDestroy();
|
||||
|
||||
private:
|
||||
friend class WindowClassRegistrar;
|
||||
|
||||
// OS callback called by message pump. Handles the WM_NCCREATE message which
|
||||
// is passed when the non-client area is being created and enables automatic
|
||||
// non-client DPI scaling so that the non-client area automatically
|
||||
// responds to changes in DPI. All other messages are handled by
|
||||
// MessageHandler.
|
||||
static LRESULT CALLBACK WndProc(HWND const window,
|
||||
UINT const message,
|
||||
WPARAM const wparam,
|
||||
LPARAM const lparam) noexcept;
|
||||
|
||||
// Retrieves a class instance pointer for |window|
|
||||
static Win32Window* GetThisFromHandle(HWND const window) noexcept;
|
||||
|
||||
// Update the window frame's theme to match the system theme.
|
||||
static void UpdateTheme(HWND const window);
|
||||
|
||||
bool quit_on_close_ = false;
|
||||
|
||||
// window handle for top level window.
|
||||
HWND window_handle_ = nullptr;
|
||||
|
||||
// window handle for hosted content.
|
||||
HWND child_content_ = nullptr;
|
||||
};
|
||||
|
||||
#endif // RUNNER_WIN32_WINDOW_H_
|
38
ios/.gitignore
vendored
Normal file
38
ios/.gitignore
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
.idea/
|
||||
.vagrant/
|
||||
.sconsign.dblite
|
||||
.svn/
|
||||
|
||||
.DS_Store
|
||||
*.swp
|
||||
profile
|
||||
|
||||
DerivedData/
|
||||
build/
|
||||
GeneratedPluginRegistrant.h
|
||||
GeneratedPluginRegistrant.m
|
||||
|
||||
.generated/
|
||||
|
||||
*.pbxuser
|
||||
*.mode1v3
|
||||
*.mode2v3
|
||||
*.perspectivev3
|
||||
|
||||
!default.pbxuser
|
||||
!default.mode1v3
|
||||
!default.mode2v3
|
||||
!default.perspectivev3
|
||||
|
||||
xcuserdata
|
||||
|
||||
*.moved-aside
|
||||
|
||||
*.pyc
|
||||
*sync/
|
||||
Icon?
|
||||
.tags*
|
||||
|
||||
/Flutter/Generated.xcconfig
|
||||
/Flutter/ephemeral/
|
||||
/Flutter/flutter_export_environment.sh
|
@ -9,6 +9,7 @@ public class MessageManager: BaseServiceManager {
|
||||
self["setAdvancedMsgListener"] = setAdvancedMsgListener
|
||||
self["sendMessage"] = sendMessage
|
||||
self["revokeMessage"] = revokeMessage
|
||||
self["editMessage"] = editMessage
|
||||
self["deleteMessageFromLocalStorage"] = deleteMessageFromLocalStorage
|
||||
self["deleteMessageFromLocalAndSvr"] = deleteMessageFromLocalAndSvr
|
||||
self["deleteAllMsgFromLocal"] = deleteAllMsgFromLocal
|
||||
@ -47,6 +48,10 @@ public class MessageManager: BaseServiceManager {
|
||||
self["setMessageLocalEx"] = setMessageLocalEx
|
||||
self["setAppBadge"] = setAppBadge
|
||||
|
||||
self["fetchSurroundingMessages"] = fetchSurroundingMessages
|
||||
|
||||
|
||||
|
||||
self["sendMessageNotOss"] = sendMessageNotOss
|
||||
self["createImageMessageByURL"] = createImageMessageByURL
|
||||
self["createSoundMessageByURL"] = createSoundMessageByURL
|
||||
@ -71,7 +76,11 @@ public class MessageManager: BaseServiceManager {
|
||||
func revokeMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
|
||||
Open_im_sdkRevokeMessage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"],methodCall[string: "clientMsgID"])
|
||||
}
|
||||
|
||||
|
||||
func editMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
|
||||
Open_im_sdkEditMessage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"],methodCall[string: "clientMsgID"],methodCall[jsonString: "message"])
|
||||
}
|
||||
|
||||
func deleteMessageFromLocalStorage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
|
||||
Open_im_sdkDeleteMessageFromLocalStorage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "conversationID"],methodCall[string: "clientMsgID"])
|
||||
}
|
||||
@ -250,6 +259,13 @@ public class MessageManager: BaseServiceManager {
|
||||
Open_im_sdkSetCustomBusinessListener(CustomBusinessListener(channel: channel))
|
||||
callBack(result)
|
||||
}
|
||||
|
||||
func fetchSurroundingMessages(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
|
||||
Open_im_sdkFetchSurroundingMessages(BaseCallback(result: result),methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[int: "before"], methodCall[int: "after"])
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class SendMsgProgressListener: NSObject, Open_im_sdk_callbackSendMsgCallBackProtocol {
|
||||
@ -303,7 +319,14 @@ public class AdvancedMsgListener: NSObject, Open_im_sdk_callbackOnAdvancedMsgLis
|
||||
values["messageRevoked"] = messageRevoked
|
||||
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onNewRecvMessageRevoked", errCode: nil, errMsg: nil, data: values)
|
||||
}
|
||||
|
||||
|
||||
public func onNewRecvMessageEdited(_ messageEdited: String?) {
|
||||
var values: [String: Any] = [:]
|
||||
values["id"] = id
|
||||
values["messageEdited"] = messageEdited
|
||||
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onNewRecvMessageEdited", errCode: nil, errMsg: nil, data: values)
|
||||
}
|
||||
|
||||
public func onRecvC2CReadReceipt(_ msgReceiptList: String?) {
|
||||
var values: [String: Any] = [:]
|
||||
values["id"] = id
|
||||
|
@ -4,7 +4,7 @@
|
||||
#
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'flutter_openim_sdk'
|
||||
s.version = '0.0.5'
|
||||
s.version = '0.0.11'
|
||||
s.summary = 'A new Flutter project.'
|
||||
s.description = <<-DESC
|
||||
A new Flutter project.
|
||||
@ -19,7 +19,7 @@ A new Flutter project.
|
||||
|
||||
#s.ios.vendored_frameworks = 'frameworks/*.xcframework'
|
||||
#s.vendored_frameworks = 'frameworks/*.xcframework'
|
||||
s.dependency 'openim_sdk_core_ios','0.5.0'
|
||||
s.dependency 'openim_sdk_core_ios','0.11.0'
|
||||
s.static_framework = true
|
||||
s.library = 'resolv'
|
||||
|
||||
|
@ -12,3 +12,12 @@ class MessageStatus {
|
||||
/// Already deleted
|
||||
static const deleted = 4;
|
||||
}
|
||||
|
||||
enum GetHistoryViewType {
|
||||
history(0),
|
||||
search(1);
|
||||
|
||||
final int rawValue;
|
||||
|
||||
const GetHistoryViewType(this.rawValue);
|
||||
}
|
||||
|
@ -2,10 +2,6 @@ import 'dart:developer';
|
||||
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
|
||||
import 'package:flutter_openim_sdk/src/models/set_channel_member_info.dart';
|
||||
|
||||
import '../listener/channel_listener.dart';
|
||||
import '../models/channel_info.dart';
|
||||
|
||||
class ChannelManager {
|
||||
MethodChannel _channel;
|
||||
|
@ -4,7 +4,6 @@ import 'dart:developer';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
|
||||
|
||||
import '../models/update_req.dart';
|
||||
|
||||
class ConversationManager {
|
||||
MethodChannel _channel;
|
||||
|
@ -3,7 +3,6 @@ import 'dart:async';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
|
||||
|
||||
import '../models/update_req.dart';
|
||||
|
||||
class FriendshipManager {
|
||||
MethodChannel _channel;
|
||||
|
@ -2,7 +2,6 @@ import 'dart:developer';
|
||||
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
|
||||
import 'package:flutter_openim_sdk/src/models/set_group_member_info.dart';
|
||||
|
||||
class GroupManager {
|
||||
MethodChannel _channel;
|
||||
|
@ -6,8 +6,6 @@ import 'package:flutter/services.dart';
|
||||
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
|
||||
import 'package:flutter_openim_sdk/src/logger.dart';
|
||||
|
||||
import '../models/channel_info.dart';
|
||||
import 'im_channel_manager.dart';
|
||||
|
||||
class IMManager {
|
||||
MethodChannel _channel;
|
||||
|
@ -556,7 +556,7 @@ class MessageManager {
|
||||
required String conversationID,
|
||||
required String clientMsgID,
|
||||
String? operationID,
|
||||
required String? content,
|
||||
required Message message,
|
||||
}) =>
|
||||
_channel.invokeMethod(
|
||||
'editMessage',
|
||||
@ -564,7 +564,7 @@ class MessageManager {
|
||||
'conversationID': conversationID,
|
||||
'clientMsgID': clientMsgID,
|
||||
"operationID": Utils.checkOperationID(operationID),
|
||||
'content': content,
|
||||
'message': message.toJson(),
|
||||
}));
|
||||
|
||||
/// Mark messages as read
|
||||
@ -592,7 +592,7 @@ class MessageManager {
|
||||
Future<AdvancedMessage> getAdvancedHistoryMessageList({
|
||||
String? conversationID,
|
||||
Message? startMsg,
|
||||
int? lastMinSeq,
|
||||
GetHistoryViewType viewType = GetHistoryViewType.history,
|
||||
int? count,
|
||||
String? operationID,
|
||||
}) =>
|
||||
@ -603,7 +603,7 @@ class MessageManager {
|
||||
'conversationID': conversationID ?? '',
|
||||
'startClientMsgID': startMsg?.clientMsgID ?? '',
|
||||
'count': count ?? 40,
|
||||
'lastMinSeq': lastMinSeq ?? 0,
|
||||
'viewType': viewType.rawValue,
|
||||
'operationID': Utils.checkOperationID(operationID),
|
||||
}))
|
||||
.then((value) =>
|
||||
@ -616,7 +616,7 @@ class MessageManager {
|
||||
Future<AdvancedMessage> getAdvancedHistoryMessageListReverse({
|
||||
String? conversationID,
|
||||
Message? startMsg,
|
||||
int? lastMinSeq,
|
||||
GetHistoryViewType viewType = GetHistoryViewType.history,
|
||||
int? count,
|
||||
String? operationID,
|
||||
}) =>
|
||||
@ -627,7 +627,7 @@ class MessageManager {
|
||||
'conversationID': conversationID ?? '',
|
||||
'startClientMsgID': startMsg?.clientMsgID ?? '',
|
||||
'count': count ?? 40,
|
||||
'lastMinSeq': lastMinSeq ?? 0,
|
||||
'viewType': viewType.rawValue,
|
||||
'operationID': Utils.checkOperationID(operationID),
|
||||
}))
|
||||
.then((value) =>
|
||||
@ -816,6 +816,28 @@ class MessageManager {
|
||||
}));
|
||||
}
|
||||
|
||||
/// Fetch Surrounding Messages
|
||||
/// [message] Message content
|
||||
/// [before] message index - before
|
||||
/// [after] message index - after
|
||||
/// [operationID] Operation ID
|
||||
Future<List<Message>> FetchSurroundingMessages({
|
||||
required Message message,
|
||||
int? before,
|
||||
int? after,
|
||||
String? operationID,
|
||||
}) =>
|
||||
_channel
|
||||
.invokeMethod(
|
||||
'fetchSurroundingMessages',
|
||||
_buildParam({
|
||||
'message': message.toJson(),
|
||||
'before': before ?? 0,
|
||||
'after': after ?? 0,
|
||||
'operationID': Utils.checkOperationID(operationID),
|
||||
}))
|
||||
.then((value) => Utils.toList(value, (map) => Message.fromJson(map)));
|
||||
|
||||
static Map _buildParam(Map<String, dynamic> param) {
|
||||
param["ManagerName"] = "messageManager";
|
||||
param = Utils.cleanMap(param);
|
||||
|
@ -1149,9 +1149,14 @@ class EditedInfo {
|
||||
/// Conversation type [ConversationType]
|
||||
int? sessionType;
|
||||
|
||||
/// Message contentType
|
||||
int? contentType;
|
||||
|
||||
/// Message content
|
||||
String? content;
|
||||
|
||||
|
||||
|
||||
EditedInfo({
|
||||
this.editerID,
|
||||
this.clientMsgID,
|
||||
@ -1160,6 +1165,7 @@ class EditedInfo {
|
||||
this.sourceMessageSendID,
|
||||
this.sourceMessageSenderNickname,
|
||||
this.sessionType,
|
||||
this.contentType,
|
||||
this.content,
|
||||
});
|
||||
|
||||
@ -1171,7 +1177,9 @@ class EditedInfo {
|
||||
sourceMessageSendID = json['sourceMessageSendID'];
|
||||
sourceMessageSenderNickname = json['sourceMessageSenderNickname'];
|
||||
sessionType = json['sessionType'];
|
||||
contentType = json['contentType'];
|
||||
content = json['content'];
|
||||
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
@ -1183,6 +1191,7 @@ class EditedInfo {
|
||||
data['sourceMessageSendID'] = this.sourceMessageSendID;
|
||||
data['sourceMessageSenderNickname'] = this.sourceMessageSenderNickname;
|
||||
data['sessionType'] = this.sessionType;
|
||||
data['contentType'] = this.contentType;
|
||||
data['content'] = this.content;
|
||||
return data;
|
||||
}
|
||||
|
@ -1,5 +1,4 @@
|
||||
import '../../flutter_openim_sdk.dart';
|
||||
import 'channel_info.dart';
|
||||
|
||||
/// OA notification
|
||||
class OANotification {
|
||||
@ -456,8 +455,6 @@ class GroupMemberInfoChangedNotification {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
///todo 所有的聊天的操作者都没有,暂时没有处理
|
||||
/// 聊天室事件通知
|
||||
class ChannelNotification {
|
||||
@ -481,7 +478,8 @@ class ChannelNotification {
|
||||
});
|
||||
|
||||
ChannelNotification.fromJson(Map<String, dynamic> json) {
|
||||
Channel = json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null;
|
||||
Channel =
|
||||
json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null;
|
||||
opUser = json['opUser'] != null
|
||||
? ChannelMembersInfo.fromJson(json['opUser'])
|
||||
: null;
|
||||
@ -514,7 +512,6 @@ class ChannelNotification {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// 组踢出成员通知
|
||||
class KickedChannelMemeberNotification {
|
||||
/// 聊天室信息
|
||||
@ -530,7 +527,8 @@ class KickedChannelMemeberNotification {
|
||||
{this.Channel, this.opUser, this.kickedUserList});
|
||||
|
||||
KickedChannelMemeberNotification.fromJson(Map<String, dynamic> json) {
|
||||
Channel = json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null;
|
||||
Channel =
|
||||
json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null;
|
||||
opUser = json['opUser'] != null
|
||||
? ChannelMembersInfo.fromJson(json['opUser'])
|
||||
: null;
|
||||
@ -569,7 +567,8 @@ class QuitChannelNotification {
|
||||
QuitChannelNotification({this.Channel, this.quitUser});
|
||||
|
||||
QuitChannelNotification.fromJson(Map<String, dynamic> json) {
|
||||
Channel = json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null;
|
||||
Channel =
|
||||
json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null;
|
||||
quitUser = json['quitUser'] != null
|
||||
? ChannelMembersInfo.fromJson(json['quitUser'])
|
||||
: null;
|
||||
@ -598,7 +597,8 @@ class EnterChannelNotification {
|
||||
EnterChannelNotification({this.Channel, this.entrantUser});
|
||||
|
||||
EnterChannelNotification.fromJson(Map<String, dynamic> json) {
|
||||
Channel = json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null;
|
||||
Channel =
|
||||
json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null;
|
||||
entrantUser = json['entrantUser'] != null
|
||||
? ChannelMembersInfo.fromJson(json['entrantUser'])
|
||||
: null;
|
||||
@ -616,7 +616,6 @@ class EnterChannelNotification {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// 禁言成员通知
|
||||
class MuteChannelMemberNotification {
|
||||
/// 聊天室信息
|
||||
@ -639,7 +638,8 @@ class MuteChannelMemberNotification {
|
||||
});
|
||||
|
||||
MuteChannelMemberNotification.fromJson(Map<String, dynamic> json) {
|
||||
Channel = json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null;
|
||||
Channel =
|
||||
json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null;
|
||||
opUser = json['opUser'] != null
|
||||
? ChannelMembersInfo.fromJson(json['opUser'])
|
||||
: null;
|
||||
@ -683,7 +683,8 @@ class ChannelMemberInfoChangedNotification {
|
||||
});
|
||||
|
||||
ChannelMemberInfoChangedNotification.fromJson(Map<String, dynamic> json) {
|
||||
Channel = json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null;
|
||||
Channel =
|
||||
json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null;
|
||||
opUser = json['opUser'] != null
|
||||
? ChannelMembersInfo.fromJson(json['opUser'])
|
||||
: null;
|
||||
|
@ -2,7 +2,7 @@ import 'package:flutter/services.dart';
|
||||
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
|
||||
|
||||
class OpenIM {
|
||||
static const version = '3.8.2+1';
|
||||
static const version = '3.8.3+2';
|
||||
|
||||
static const _channel = MethodChannel('flutter_openim_sdk');
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
name: flutter_openim_sdk
|
||||
description: An instant messaging plug-in that supports Android and IOS. And the server is also all open source.
|
||||
version: 3.8.2+1
|
||||
version: 3.8.3+2
|
||||
homepage: https://www.openim.io
|
||||
repository: https://github.com/openimsdk/open-im-sdk-flutter
|
||||
|
||||
@ -32,7 +32,8 @@ flutter:
|
||||
pluginClass: FlutterOpenimSdkPlugin
|
||||
ios:
|
||||
pluginClass: FlutterOpenimSdkPlugin
|
||||
|
||||
windows:
|
||||
pluginClass: FlutterOpenimSdkPlugin
|
||||
# To add assets to your plugin package, add an assets section, like this:
|
||||
# assets:
|
||||
# - images/a_dot_burr.jpeg
|
||||
|
15
windows/.gitignore
vendored
Normal file
15
windows/.gitignore
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
flutter/
|
||||
|
||||
# Visual Studio user-specific files.
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# Visual Studio build-related files.
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!*.[Cc]ache/
|
191
windows/CMakeLists.txt
Normal file
191
windows/CMakeLists.txt
Normal file
@ -0,0 +1,191 @@
|
||||
# The Flutter tooling requires that developers have a version of Visual Studio
|
||||
# installed that includes CMake 3.14 or later. You should not increase this
|
||||
# version, as doing so will cause the plugin to fail to compile for some
|
||||
# customers of the plugin.
|
||||
cmake_minimum_required(VERSION 3.14)
|
||||
|
||||
# Project-level configuration.
|
||||
set(PROJECT_NAME "flutter_openim_sdk")
|
||||
project(${PROJECT_NAME} LANGUAGES CXX)
|
||||
|
||||
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
|
||||
# versions of CMake.
|
||||
cmake_policy(VERSION 3.14...3.25)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# 定义一个函数用于下载和解压SDK
|
||||
# 参数:
|
||||
# DOWNLOAD_URL - 下载URL
|
||||
# TARGET_DIR - 目标目录
|
||||
function(download_and_extract_sdk)
|
||||
# 解析参数
|
||||
set(oneValueArgs DOWNLOAD_URL TARGET_DIR)
|
||||
cmake_parse_arguments(PARSE_ARGV 0 ARG "" "${oneValueArgs}" "")
|
||||
|
||||
if(NOT ARG_DOWNLOAD_URL OR NOT ARG_TARGET_DIR)
|
||||
message(FATAL_ERROR "DOWNLOAD_URL and TARGET_DIR must be specified")
|
||||
endif()
|
||||
|
||||
# 从URL中提取文件名
|
||||
set(SPLIT "download=")
|
||||
string(LENGTH ${SPLIT} SPLIT_LENGTH)
|
||||
string(LENGTH ${ARG_DOWNLOAD_URL} URL_LENGTH)
|
||||
string(FIND ${ARG_DOWNLOAD_URL} ${SPLIT} POS)
|
||||
|
||||
if(POS GREATER_EQUAL 0)
|
||||
math(EXPR SPLIT_POS "${POS}+${SPLIT_LENGTH}")
|
||||
string(SUBSTRING ${ARG_DOWNLOAD_URL} ${SPLIT_POS} ${URL_LENGTH} FILE_NAME)
|
||||
else()
|
||||
# 如果没有找到分割字符串,使用默认文件名
|
||||
set(FILE_NAME "sdk_package.tar.gz")
|
||||
endif()
|
||||
|
||||
# 设置完整文件路径
|
||||
set(FULL_PATH "${ARG_TARGET_DIR}/${FILE_NAME}")
|
||||
|
||||
# 检查文件是否存在且大小不为0
|
||||
if(EXISTS "${FULL_PATH}")
|
||||
file(SIZE "${FULL_PATH}" FILE_SIZE)
|
||||
if(NOT ${FILE_SIZE})
|
||||
file(REMOVE_RECURSE "${FULL_PATH}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# 下载和解压
|
||||
if(NOT EXISTS "${FULL_PATH}")
|
||||
file(MAKE_DIRECTORY ${ARG_TARGET_DIR})
|
||||
message("[download_sdk]: 开始从 ${ARG_DOWNLOAD_URL} 下载SDK")
|
||||
|
||||
# 下载文件
|
||||
file(DOWNLOAD ${ARG_DOWNLOAD_URL} ${FULL_PATH}
|
||||
STATUS DOWNLOAD_STATUS
|
||||
LOG DOWNLOAD_LOG)
|
||||
|
||||
list(GET DOWNLOAD_STATUS 0 STATUS_CODE)
|
||||
if(NOT STATUS_CODE EQUAL 0)
|
||||
message(FATAL_ERROR "[download_sdk]: 下载失败: ${DOWNLOAD_STATUS}, 日志: ${DOWNLOAD_LOG}")
|
||||
endif()
|
||||
|
||||
message("[download_sdk]: 下载完成")
|
||||
else()
|
||||
message("[download_sdk]: SDK包已存在,跳过下载")
|
||||
endif()
|
||||
|
||||
message("[download_sdk]: 开始解压 ${FILE_NAME}")
|
||||
file(ARCHIVE_EXTRACT
|
||||
INPUT ${FULL_PATH}
|
||||
DESTINATION ${ARG_TARGET_DIR})
|
||||
message("[download_sdk]: 解压完成")
|
||||
endfunction()
|
||||
|
||||
# third_party
|
||||
set(ALOG_SDK_URL "http://192.168.77.132:8081/repository/mvn2-group/com/alog/1.0/alog-1.0.zip?download=alog-1.0.zip")
|
||||
|
||||
download_and_extract_sdk(
|
||||
DOWNLOAD_URL ${ALOG_SDK_URL}
|
||||
TARGET_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party
|
||||
)
|
||||
|
||||
# openim
|
||||
set(OPENIM_SDK_URL "http://192.168.77.132:8081/repository/mvn2-group/com/openim_pc/1.0.0/openim_pc-1.0.0.zip?download=openim_pc-1.0.0.zip")
|
||||
|
||||
download_and_extract_sdk(
|
||||
DOWNLOAD_URL ${OPENIM_SDK_URL}
|
||||
TARGET_DIR ${CMAKE_CURRENT_SOURCE_DIR}/openlib
|
||||
)
|
||||
# This value is used when generating builds using this plugin, so it must
|
||||
# not be changed
|
||||
set(PLUGIN_NAME "flutter_openim_sdk_plugin")
|
||||
set(PCH_HEADER_FILE ${CMAKE_CURRENT_LIST_DIR}/src/common/stable.h)
|
||||
|
||||
# third_party_libs
|
||||
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/third_party/alog/include")
|
||||
link_directories("${CMAKE_CURRENT_SOURCE_DIR}/third_party/alog/lib/x64/${CMAKE_BUILD_TYPE}")
|
||||
|
||||
FILE(GLOB SELF_TEMP_SRC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} src/*.cpp src/*.h)
|
||||
source_group(src FILES ${SELF_TEMP_SRC_FILES})
|
||||
list(APPEND NIM_CORE_SOURCES ${SELF_TEMP_SRC_FILES})
|
||||
|
||||
FILE(GLOB SELF_TEMP_SRC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} src/common/*.cpp src/common/*.h)
|
||||
source_group(src/common FILES ${SELF_TEMP_SRC_FILES})
|
||||
list(APPEND NIM_CORE_SOURCES ${SELF_TEMP_SRC_FILES})
|
||||
|
||||
FILE(GLOB SELF_TEMP_SRC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} src/common/services/*.cpp src/common/services/*.h)
|
||||
source_group(src/common/services FILES ${SELF_TEMP_SRC_FILES})
|
||||
list(APPEND NIM_CORE_SOURCES ${SELF_TEMP_SRC_FILES})
|
||||
|
||||
FILE(GLOB SELF_TEMP_SRC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} src/common/utils/*.cpp src/common/utils/*.h src/common/utils/*.hpp)
|
||||
source_group(src/common/utils FILES ${SELF_TEMP_SRC_FILES})
|
||||
list(APPEND NIM_CORE_SOURCES ${SELF_TEMP_SRC_FILES})
|
||||
|
||||
FILE(GLOB SELF_TEMP_SRC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} src/utils/*.cpp src/utils/*.h)
|
||||
source_group(src/utils FILES ${SELF_TEMP_SRC_FILES})
|
||||
list(APPEND NIM_CORE_SOURCES ${SELF_TEMP_SRC_FILES})
|
||||
|
||||
FILE(GLOB SELF_TEMP_SRC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} src/utils/dump/*.cpp src/utils/dump/*.h)
|
||||
source_group(src/utils/dump FILES ${SELF_TEMP_SRC_FILES})
|
||||
list(APPEND NIM_CORE_SOURCES ${SELF_TEMP_SRC_FILES})
|
||||
|
||||
# Any new source files that you add to the plugin should be added here.
|
||||
list(APPEND PLUGIN_SOURCES
|
||||
${CMAKE_CURRENT_LIST_DIR}/flutter_openim_sdk_plugin.cpp
|
||||
)
|
||||
|
||||
add_library(${PLUGIN_NAME} SHARED
|
||||
${PLUGIN_SOURCES}
|
||||
${NIM_CORE_SOURCES}
|
||||
)
|
||||
target_precompile_headers(${PLUGIN_NAME} PRIVATE ${PCH_HEADER_FILE})
|
||||
target_link_libraries(${PLUGIN_NAME} PRIVATE yx_alog)
|
||||
|
||||
# Apply a standard set of build settings that are configured in the
|
||||
# application-level CMakeLists.txt. This can be removed for plugins that want
|
||||
# full control over build settings.
|
||||
apply_standard_settings(${PLUGIN_NAME})
|
||||
|
||||
# Symbols are hidden by default to reduce the chance of accidental conflicts
|
||||
# between plugins. This should not be removed; any symbols that should be
|
||||
# exported should be explicitly exported with the FLUTTER_PLUGIN_EXPORT macro.
|
||||
set_target_properties(${PLUGIN_NAME} PROPERTIES
|
||||
CXX_VISIBILITY_PRESET hidden)
|
||||
target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL)
|
||||
target_compile_options(${PLUGIN_NAME} PRIVATE /W4 /WX- /wd4100 /wd4267 /wd4189 /wd4244 /wd4996 /bigobj /utf-8)
|
||||
|
||||
target_include_directories(${PLUGIN_NAME} PUBLIC
|
||||
"${CMAKE_CURRENT_LIST_DIR}/include"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/openlib/x64/include"
|
||||
)
|
||||
|
||||
target_link_libraries(${PLUGIN_NAME} PRIVATE
|
||||
flutter
|
||||
flutter_wrapper_plugin
|
||||
${CMAKE_CURRENT_LIST_DIR}/openlib/x64/libopenimsdk.lib
|
||||
)
|
||||
|
||||
|
||||
|
||||
file(GLOB flutter_openim_sdk_bundled_libraries
|
||||
"${CMAKE_CURRENT_LIST_DIR}/openlib/x64/*.dll"
|
||||
)
|
||||
|
||||
file(GLOB LIBRARY_FILES "${CMAKE_CURRENT_LIST_DIR}/openlib/x64/*")
|
||||
foreach(LIB_FILE ${LIBRARY_FILES})
|
||||
if(LIB_FILE MATCHES "cacert\.pem")
|
||||
# 添加库文件路径到变量
|
||||
list(APPEND flutter_openim_sdk_bundled_libraries ${LIB_FILE})
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
set(flutter_openim_sdk_bundled_libraries ${flutter_openim_sdk_bundled_libraries} PARENT_SCOPE)
|
||||
|
||||
|
||||
|
||||
#install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/openlib/libopenimsdk.dll
|
||||
# DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
|
||||
#)
|
110
windows/flutter_openim_sdk_plugin.cpp
Normal file
110
windows/flutter_openim_sdk_plugin.cpp
Normal file
@ -0,0 +1,110 @@
|
||||
#include "include/flutter_openim_sdk/flutter_openim_sdk_plugin.h"
|
||||
|
||||
// This must be included before many other Windows headers.
|
||||
#include <windows.h>
|
||||
|
||||
// For getPlatformVersion; remove unless needed for your plugin implementation.
|
||||
#include <VersionHelpers.h>
|
||||
|
||||
#include <flutter/method_channel.h>
|
||||
#include <flutter/plugin_registrar_windows.h>
|
||||
#include <flutter/standard_method_codec.h>
|
||||
|
||||
#include <memory>
|
||||
#include <sstream>
|
||||
#include "src/MethodCallHandlerImpl.h"
|
||||
#include "src/common/stable.h"
|
||||
#include "src/common/ThreadUtil.h"
|
||||
|
||||
|
||||
class FlutterOpenimSdkPlugin : public flutter::Plugin {
|
||||
public:
|
||||
static void RegisterWithRegistrar(flutter::PluginRegistrarWindows *registrar);
|
||||
|
||||
FlutterOpenimSdkPlugin();
|
||||
|
||||
virtual ~FlutterOpenimSdkPlugin();
|
||||
|
||||
// Disallow copy and assign.
|
||||
FlutterOpenimSdkPlugin(const FlutterOpenimSdkPlugin &) = delete;
|
||||
|
||||
FlutterOpenimSdkPlugin &operator=(const FlutterOpenimSdkPlugin &) = delete;
|
||||
|
||||
// Called when a method is called on this plugin's channel from Dart.
|
||||
void HandleMethodCall(
|
||||
const flutter::MethodCall <flutter::EncodableValue> &method_call,
|
||||
std::unique_ptr <flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
public:
|
||||
std::unique_ptr<MethodCallHandlerImpl> m_channel;
|
||||
};
|
||||
|
||||
//std::string ws2s(const std::wstring& wstr) {
|
||||
// using convert_typeX = std::codecvt_utf8<wchar_t>;
|
||||
// std::wstring_convert<convert_typeX, wchar_t> converterX;
|
||||
// return converterX.to_bytes(wstr);
|
||||
//}
|
||||
|
||||
// static
|
||||
void FlutterOpenimSdkPlugin::RegisterWithRegistrar(
|
||||
flutter::PluginRegistrarWindows *registrar) {
|
||||
|
||||
//std::string filePath = ws2s(_wgetenv(L"LOCALAPPDATA"));
|
||||
std::string filePath = std::getenv("LOCALAPPDATA");
|
||||
std::string filePathApp;
|
||||
if (!filePath.empty()) {
|
||||
filePath.append("/OpenIM/OpenimPlugin");
|
||||
} else {
|
||||
std::cout << "log filePath empty!" << std::endl;
|
||||
}
|
||||
filePathApp = filePath;
|
||||
filePathApp.append("/app");
|
||||
std::cout << "log filePath: " << filePathApp.c_str() << std::endl;
|
||||
ALog::CreateInstance(filePathApp, "nim_core_plugin", Info);
|
||||
ALog::GetInstance()->setShortFileName(true);
|
||||
YXLOG(Info) << "===================start===================" << YXLOGEnd;
|
||||
YXLOG_API(Info) << "RegisterWithRegistrar, logPath: " << filePathApp
|
||||
<< YXLOGEnd;
|
||||
//InitDumpInfo("");
|
||||
|
||||
NimCore::getInstance()->setLogDir(filePath);
|
||||
|
||||
// Initialize ThreadUtil to capture the platform thread ID
|
||||
// This is called on the platform thread already, so it will initialize correctly
|
||||
ThreadUtil::InitializePlatformThreadId();
|
||||
YXLOG_API(Info) << "ThreadUtil initialized on platform thread" << YXLOGEnd;
|
||||
|
||||
auto plugin = std::make_unique<FlutterOpenimSdkPlugin>();
|
||||
auto channel = plugin->m_channel->startListening(registrar);
|
||||
channel->SetMethodCallHandler(
|
||||
[plugin_pointer = plugin.get()](const auto &call, auto result) {
|
||||
plugin_pointer->HandleMethodCall(call, std::move(result));
|
||||
});
|
||||
|
||||
|
||||
registrar->AddPlugin(std::move(plugin));
|
||||
}
|
||||
|
||||
FlutterOpenimSdkPlugin::FlutterOpenimSdkPlugin() {
|
||||
m_channel = std::make_unique<MethodCallHandlerImpl>();
|
||||
}
|
||||
|
||||
FlutterOpenimSdkPlugin::~FlutterOpenimSdkPlugin() {
|
||||
m_channel.reset(nullptr);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void FlutterOpenimSdkPlugin::HandleMethodCall(
|
||||
const flutter::MethodCall <flutter::EncodableValue> &method_call,
|
||||
std::unique_ptr <flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
m_channel->onMethodCall(method_call, std::move(result));
|
||||
}
|
||||
|
||||
|
||||
void FlutterOpenimSdkPluginRegisterWithRegistrar(FlutterDesktopPluginRegistrarRef registrar) {
|
||||
FlutterOpenimSdkPlugin::RegisterWithRegistrar(
|
||||
flutter::PluginRegistrarManager::GetInstance()
|
||||
->GetRegistrar<flutter::PluginRegistrarWindows>(registrar));
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
#ifndef FLUTTER_PLUGIN_FLUTTER_OPENIM_SDK_PLUGIN_H_
|
||||
#define FLUTTER_PLUGIN_FLUTTER_OPENIM_SDK_PLUGIN_H_
|
||||
|
||||
#include <flutter/plugin_registrar_windows.h>
|
||||
#include <flutter_plugin_registrar.h>
|
||||
|
||||
#ifdef FLUTTER_PLUGIN_IMPL
|
||||
#define FLUTTER_PLUGIN_EXPORT __declspec(dllexport)
|
||||
#else
|
||||
#define FLUTTER_PLUGIN_EXPORT __declspec(dllimport)
|
||||
#endif
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
FLUTTER_PLUGIN_EXPORT void FlutterOpenimSdkPluginRegisterWithRegistrar(
|
||||
FlutterDesktopPluginRegistrarRef registrar);
|
||||
|
||||
#if defined(__cplusplus)
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
#endif // FLUTTER_PLUGIN_FLUTTER_OPENIM_SDK_PLUGIN_H_
|
46
windows/src/FLTConvert.cpp
Normal file
46
windows/src/FLTConvert.cpp
Normal file
@ -0,0 +1,46 @@
|
||||
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
|
||||
// Use of this source code is governed by a MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "FLTConvert.h"
|
||||
|
||||
Convert::Convert() {}
|
||||
|
||||
std::string Convert::getStringFormMapForLog(
|
||||
const flutter::EncodableMap* arguments) const {
|
||||
if (!arguments) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// todo
|
||||
return "";
|
||||
}
|
||||
|
||||
void Convert::getLogList(const std::string& strLog,
|
||||
std::list<std::string>& listLog) const {
|
||||
listLog.clear();
|
||||
int num = 15 * 1024; // 分割定长大小
|
||||
int len = strLog.length(); // 字符串长度
|
||||
int end = num;
|
||||
for (int start = 0; start < len;) {
|
||||
if (end > len) // 针对最后一个分割串
|
||||
{
|
||||
listLog.emplace_back(
|
||||
strLog.substr(start, len - start)); // 最后一个字符串的原始部分
|
||||
break;
|
||||
}
|
||||
listLog.emplace_back(
|
||||
strLog.substr(start, num)); // 从0开始,分割num位字符串
|
||||
start = end;
|
||||
end = end + num;
|
||||
}
|
||||
}
|
||||
|
||||
std::string Convert::getStringFormListForLog(
|
||||
const flutter::EncodableList* arguments) const {
|
||||
if (!arguments) {
|
||||
return "";
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
29
windows/src/FLTConvert.h
Normal file
29
windows/src/FLTConvert.h
Normal file
@ -0,0 +1,29 @@
|
||||
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
|
||||
// Use of this source code is governed by a MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLTCONVERT_H
|
||||
#define FLTCONVERT_H
|
||||
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
|
||||
#include "common/FLTService.h"
|
||||
#include "common/utils/singleton.h"
|
||||
|
||||
class Convert {
|
||||
public:
|
||||
SINGLETONG(Convert)
|
||||
|
||||
std::string getStringFormMapForLog(
|
||||
const flutter::EncodableMap* arguments) const;
|
||||
void getLogList(const std::string& strLog,
|
||||
std::list<std::string>& listLog) const;
|
||||
std::string getStringFormListForLog(
|
||||
const flutter::EncodableList* arguments) const;
|
||||
|
||||
private:
|
||||
Convert();
|
||||
};
|
||||
|
||||
#endif // FLTCONVERT_H
|
45
windows/src/MethodCallHandlerImpl.cpp
Normal file
45
windows/src/MethodCallHandlerImpl.cpp
Normal file
@ -0,0 +1,45 @@
|
||||
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
|
||||
// Use of this source code is governed by a MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "MethodCallHandlerImpl.h"
|
||||
|
||||
#include <flutter/method_channel.h>
|
||||
#include <flutter/plugin_registrar_windows.h>
|
||||
#include <flutter/standard_method_codec.h>
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "NimCore.h"
|
||||
|
||||
MethodCallHandlerImpl::MethodCallHandlerImpl() {}
|
||||
|
||||
void MethodCallHandlerImpl::onMethodCall(
|
||||
const flutter::MethodCall <flutter::EncodableValue> &method_call,
|
||||
std::shared_ptr <flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
const auto *arguments =
|
||||
std::get_if<flutter::EncodableMap>(method_call.arguments());
|
||||
if (arguments) {
|
||||
NimCore::getInstance()->onMethodCall(method_call.method_name(), arguments,
|
||||
result);
|
||||
} else {
|
||||
if (result) {
|
||||
result->NotImplemented();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flutter::MethodChannel <flutter::EncodableValue> *
|
||||
MethodCallHandlerImpl::startListening(flutter::PluginRegistrar *registrar) {
|
||||
m_methodChannel =
|
||||
std::make_unique < flutter::MethodChannel < flutter::EncodableValue >> (
|
||||
registrar->messenger(), "flutter_openim_sdk",
|
||||
&flutter::StandardMethodCodec::GetInstance());
|
||||
|
||||
NimCore::getInstance()->setMethodChannel(m_methodChannel.get());
|
||||
return m_methodChannel.get();
|
||||
}
|
||||
|
||||
void MethodCallHandlerImpl::stopListening() {
|
||||
NimCore::getInstance()->setMethodChannel(nullptr);
|
||||
}
|
34
windows/src/MethodCallHandlerImpl.h
Normal file
34
windows/src/MethodCallHandlerImpl.h
Normal file
@ -0,0 +1,34 @@
|
||||
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
|
||||
// Use of this source code is governed by a MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef METHODCALLHANDLERIMPL_H
|
||||
#define METHODCALLHANDLERIMPL_H
|
||||
|
||||
#include <flutter/method_channel.h>
|
||||
#include <flutter/plugin_registrar_windows.h>
|
||||
#include <flutter/standard_method_codec.h>
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "NimCore.h"
|
||||
|
||||
class MethodCallHandlerImpl {
|
||||
public:
|
||||
MethodCallHandlerImpl();
|
||||
|
||||
void onMethodCall(
|
||||
const flutter::MethodCall<flutter::EncodableValue>& method_call,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
flutter::MethodChannel<flutter::EncodableValue>* startListening(
|
||||
flutter::PluginRegistrar* registrar);
|
||||
|
||||
void stopListening();
|
||||
|
||||
private:
|
||||
std::unique_ptr<flutter::MethodChannel<flutter::EncodableValue>>
|
||||
m_methodChannel;
|
||||
};
|
||||
|
||||
#endif // METHODCALLHANDLERIMPL_H
|
272
windows/src/NimCore.cpp
Normal file
272
windows/src/NimCore.cpp
Normal file
@ -0,0 +1,272 @@
|
||||
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
|
||||
// Use of this source code is governed by a MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "NimCore.h"
|
||||
|
||||
#include <flutter/encodable_value.h>
|
||||
#include <flutter/method_channel.h>
|
||||
#include <flutter/plugin_registrar_windows.h>
|
||||
#include <flutter/standard_method_codec.h>
|
||||
|
||||
#include "FLTConvert.h"
|
||||
#include "common/ThreadUtil.h"
|
||||
#include "common/services/IMManager.h"
|
||||
#include "common/services/UserManager.h"
|
||||
#include "common/services/FriendManager.h"
|
||||
#include "common/services/MessageManager.h"
|
||||
#include "common/services/GroupManager.h"
|
||||
#include "common/services/ChannelManager.h"
|
||||
#include "common/services/ConversationManager.h"
|
||||
#include "common/stable.h"
|
||||
|
||||
|
||||
const std::string kFLTNimCoreService = "serviceName";
|
||||
|
||||
NimCore::NimCore() { regService(); }
|
||||
|
||||
NimCore::~NimCore() {}
|
||||
|
||||
void NimCore::regService() {
|
||||
addService(new IMManagerService());
|
||||
addService(new UserManagerService());
|
||||
addService(new FriendshipManagerService());
|
||||
addService(new MessageManagerService());
|
||||
addService(new GroupManagerService());
|
||||
addService(new ChannelManagerService());
|
||||
addService(new ConversationManagerService());
|
||||
}
|
||||
|
||||
void NimCore::cleanService() {
|
||||
// m_services.clear();
|
||||
|
||||
}
|
||||
|
||||
void NimCore::addService(FLTService* service) {
|
||||
m_services[service->getServiceName()] = service;
|
||||
}
|
||||
|
||||
// FLTMessageService* NimCore::getFLTMessageService() const {
|
||||
// return dynamic_cast<FLTMessageService*>(getService("MessageService"));
|
||||
// }
|
||||
|
||||
FLTService* NimCore::getService(const std::string& serviceName) const {
|
||||
auto service = m_services.find(serviceName);
|
||||
if (m_services.end() == service) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return service->second;
|
||||
}
|
||||
|
||||
void NimCore::onMethodCall(
|
||||
const std::string& method, const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (nullptr == arguments) {
|
||||
if (result) {
|
||||
result->NotImplemented();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
auto serviceName_iter =
|
||||
arguments->find(flutter::EncodableValue("ManagerName"));
|
||||
if (serviceName_iter != arguments->end() &&
|
||||
!serviceName_iter->second.IsNull()) {
|
||||
std::string serviceName = std::get<std::string>(serviceName_iter->second);
|
||||
auto* service = getService(serviceName);
|
||||
if (service) {
|
||||
std::shared_ptr<MockMethodResult> mockResult =
|
||||
std::make_shared<MockMethodResult>(serviceName, method, result);
|
||||
YXLOG_API(Info) << "mn: " << method << ", args: "
|
||||
<< Convert::getInstance()->getStringFormMapForLog(
|
||||
arguments)
|
||||
<< YXLOGEnd;
|
||||
service->onMethodCalled(method, arguments, mockResult);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
YXLOG_API(Warn) << "sn not found, mn: " << method << YXLOGEnd;
|
||||
}
|
||||
|
||||
if (result) {
|
||||
result->NotImplemented();
|
||||
}
|
||||
}
|
||||
|
||||
void NimCore::invokeMethod(const std::string& method,
|
||||
const flutter::EncodableMap& arguments) {
|
||||
if (m_channel) {
|
||||
// Use ThreadUtil to ensure we're on the platform thread
|
||||
ThreadUtil::InvokeMethodOnPlatformThread(
|
||||
m_channel, method, std::make_unique<flutter::EncodableValue>(arguments));
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
class InterResult : public flutter::MethodResult<T> {
|
||||
protected:
|
||||
void SuccessInternal(const T* result) override {
|
||||
if (result != nullptr) {
|
||||
NimCore::getInstance()->invokeCallback(flutter::EncodableValue(*result));
|
||||
} else {
|
||||
NimCore::getInstance()->invokeCallback(std::nullopt);
|
||||
}
|
||||
}
|
||||
|
||||
// Implementation of the public interface, to be provided by subclasses.
|
||||
void ErrorInternal(const std::string& error_code,
|
||||
const std::string& error_message,
|
||||
const T* error_details) override {}
|
||||
|
||||
// Implementation of the public interface, to be provided by subclasses.
|
||||
void NotImplementedInternal() override {}
|
||||
};
|
||||
|
||||
void NimCore::invokeMethod(const std::string& eventName,
|
||||
const flutter::EncodableMap& arguments,
|
||||
const InvokeMehtodCallback& callback) {
|
||||
invokeCallback = callback;
|
||||
if (m_channel) {
|
||||
// Create shared pointers for the data to ensure copy constructibility
|
||||
auto eventNameCopy = std::make_shared<std::string>(eventName);
|
||||
auto argsCopy = std::make_shared<flutter::EncodableMap>(arguments);
|
||||
|
||||
// Use ThreadUtil to ensure we're on the platform thread
|
||||
ThreadUtil::RunOnPlatformThread([this, eventNameCopy, argsCopy]() {
|
||||
m_channel->InvokeMethod(
|
||||
*eventNameCopy, std::make_unique<flutter::EncodableValue>(*argsCopy),
|
||||
std::make_unique<InterResult<flutter::EncodableValue>>());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void NimCore::setMethodChannel(NimMethodChannel* channel) {
|
||||
m_channel = channel;
|
||||
}
|
||||
|
||||
NimCore::NimMethodChannel* NimCore::getMethodChannel() { return m_channel; }
|
||||
|
||||
void NimCore::setAppkey(const std::string& appkey) { m_appKey = appkey; }
|
||||
|
||||
std::string NimCore::getAppkey() const { return m_appKey; }
|
||||
|
||||
void NimCore::setLogDir(const std::string& logDir) { m_logDir = logDir; }
|
||||
|
||||
std::string NimCore::getLogDir() const { return m_logDir; }
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
MockMethodResult::MockMethodResult(
|
||||
const std::string serviceName, const std::string methodName,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
: m_serviceName(serviceName),
|
||||
m_methodName(methodName),
|
||||
m_result(std::move(result)) {}
|
||||
|
||||
void MockMethodResult::ErrorInternal(const std::string& error_code,
|
||||
const std::string& error_message,
|
||||
const flutter::EncodableValue* details) {
|
||||
YXLOG_API(Warn) << "cb error, sn: " << m_serviceName
|
||||
<< ", mn: " << m_methodName << ", error_code: " << error_code
|
||||
<< ", error_msg: " << error_message
|
||||
<< ", details: " << getStringFormEncodableValue(details)
|
||||
<< YXLOGEnd;
|
||||
if (m_result) m_result->Success(*details);
|
||||
// //失败情况下, 也调用success接口,避免dart层抛出异常
|
||||
// m_result->Error(error_code, error_message, *details);
|
||||
}
|
||||
|
||||
void MockMethodResult::NotImplementedInternal() {
|
||||
YXLOG_API(Warn) << "cb notImplemented, sn: " << m_serviceName
|
||||
<< ", mn: " << m_methodName << YXLOGEnd;
|
||||
if (m_result) m_result->NotImplemented();
|
||||
}
|
||||
|
||||
void MockMethodResult::SuccessInternal(const flutter::EncodableValue* result) {
|
||||
std::string strLog;
|
||||
strLog.append("cb succ, sn: ")
|
||||
.append(m_serviceName)
|
||||
.append(", mn: ")
|
||||
.append(m_methodName)
|
||||
.append(", result: ")
|
||||
.append(getStringFormEncodableValue(result));
|
||||
std::list<std::string> logList;
|
||||
Convert::getInstance()->getLogList(strLog, logList);
|
||||
for (auto& it : logList) {
|
||||
YXLOG_API(Info) << it << YXLOGEnd;
|
||||
}
|
||||
|
||||
if (m_result) m_result->Success(*result);
|
||||
}
|
||||
|
||||
std::string MockMethodResult::getStringFormEncodableValue(
|
||||
const flutter::EncodableValue* value) const {
|
||||
if (!value) {
|
||||
return "";
|
||||
}
|
||||
|
||||
std::string result;
|
||||
if (auto it = std::get_if<bool>(value); it) {
|
||||
result = *it ? "true" : "false";
|
||||
} else if (auto it1 = std::get_if<int32_t>(value); it1) {
|
||||
result = std::to_string(*it1);
|
||||
} else if (auto it2 = std::get_if<int64_t>(value); it2) {
|
||||
result = std::to_string(*it2);
|
||||
} else if (auto it3 = std::get_if<double>(value); it3) {
|
||||
result = std::to_string(*it3);
|
||||
} else if (auto it4 = std::get_if<std::string>(value); it4) {
|
||||
result = *it4;
|
||||
} else if (auto it5 = std::get_if<std::vector<uint8_t>>(value); it5) {
|
||||
result.append("[");
|
||||
bool bFirst = true;
|
||||
for (auto& it5Tmp : *it5) {
|
||||
if (!bFirst) {
|
||||
result.append(",");
|
||||
}
|
||||
result.append(std::to_string(it5Tmp));
|
||||
bFirst = false;
|
||||
}
|
||||
result.append("]");
|
||||
} else if (auto it6 = std::get_if<std::vector<int32_t>>(value); it6) {
|
||||
result.append("[");
|
||||
bool bFirst = true;
|
||||
for (auto& it6Tmp : *it6) {
|
||||
if (!bFirst) {
|
||||
result.append(",");
|
||||
}
|
||||
result.append(std::to_string(it6Tmp));
|
||||
bFirst = false;
|
||||
}
|
||||
result.append("]");
|
||||
} else if (auto it7 = std::get_if<std::vector<int64_t>>(value); it7) {
|
||||
result.append("[");
|
||||
bool bFirst = true;
|
||||
for (auto& it7Tmp : *it7) {
|
||||
if (!bFirst) {
|
||||
result.append(",");
|
||||
}
|
||||
result.append(std::to_string(it7Tmp));
|
||||
bFirst = false;
|
||||
}
|
||||
result.append("]");
|
||||
} else if (auto it8 = std::get_if<std::vector<double>>(value); it8) {
|
||||
result.append("[");
|
||||
bool bFirst = true;
|
||||
for (auto& it8Tmp : *it8) {
|
||||
if (!bFirst) {
|
||||
result.append(",");
|
||||
}
|
||||
result.append(std::to_string(it8Tmp));
|
||||
bFirst = false;
|
||||
}
|
||||
result.append("]");
|
||||
} else if (auto it9 = std::get_if<EncodableList>(value); it9) {
|
||||
result = Convert::getInstance()->getStringFormListForLog(it9);
|
||||
} else if (auto it10 = std::get_if<EncodableMap>(value); it10) {
|
||||
result = Convert::getInstance()->getStringFormMapForLog(it10);
|
||||
} else {
|
||||
// wjzh
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
105
windows/src/NimCore.h
Normal file
105
windows/src/NimCore.h
Normal file
@ -0,0 +1,105 @@
|
||||
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
|
||||
// Use of this source code is governed by a MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef NIMCORE_H
|
||||
#define NIMCORE_H
|
||||
|
||||
#include <flutter/encodable_value.h>
|
||||
#include <flutter/method_channel.h>
|
||||
#include <flutter/plugin_registrar_windows.h>
|
||||
#include <flutter/standard_method_codec.h>
|
||||
|
||||
class FLTService;
|
||||
|
||||
class FLTAuthService;
|
||||
|
||||
class FLTMessageService;
|
||||
|
||||
class NimCore {
|
||||
public:
|
||||
using NimMethodChannel = flutter::MethodChannel<flutter::EncodableValue>;
|
||||
|
||||
public:
|
||||
SINGLETONG(NimCore)
|
||||
|
||||
private:
|
||||
NimCore();
|
||||
|
||||
~NimCore();
|
||||
|
||||
public:
|
||||
using InvokeMehtodCallback =
|
||||
std::function<void(const std::optional <flutter::EncodableValue> &)>;
|
||||
|
||||
InvokeMehtodCallback invokeCallback;
|
||||
|
||||
void regService();
|
||||
|
||||
void cleanService();
|
||||
|
||||
void addService(FLTService *service);
|
||||
|
||||
// FLTAuthService* getFLTAuthService() const;
|
||||
// FLTMessageService* getFLTMessageService() const;
|
||||
FLTService *getService(const std::string &serviceName) const;
|
||||
|
||||
void onMethodCall(
|
||||
const std::string &method, const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr <flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
void invokeMethod(const std::string &method,
|
||||
const flutter::EncodableMap &arguments);
|
||||
|
||||
void invokeMethod(const std::string &eventName,
|
||||
const flutter::EncodableMap &arguments,
|
||||
const InvokeMehtodCallback &callback);
|
||||
|
||||
void setMethodChannel(NimMethodChannel *channel);
|
||||
|
||||
NimMethodChannel *getMethodChannel();
|
||||
|
||||
public:
|
||||
void setAppkey(const std::string &appkey);
|
||||
|
||||
std::string getAppkey() const;
|
||||
|
||||
void setLogDir(const std::string &logDir);
|
||||
|
||||
std::string getLogDir() const;
|
||||
|
||||
std::string getAccountId() const;
|
||||
|
||||
private:
|
||||
std::unordered_map<std::string, FLTService *> m_services;
|
||||
NimMethodChannel *m_channel = nullptr;
|
||||
std::string m_appKey = "";
|
||||
std::string m_logDir;
|
||||
};
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class MockMethodResult : public flutter::MethodResult<> {
|
||||
public:
|
||||
MockMethodResult(
|
||||
const std::string serviceName, const std::string methodName,
|
||||
std::shared_ptr <flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
virtual void ErrorInternal(const std::string &error_code,
|
||||
const std::string &error_message,
|
||||
const flutter::EncodableValue *details) override;
|
||||
|
||||
virtual void NotImplementedInternal() override;
|
||||
|
||||
virtual void SuccessInternal(const flutter::EncodableValue *result) override;
|
||||
|
||||
private:
|
||||
std::string getStringFormEncodableValue(
|
||||
const flutter::EncodableValue *value) const;
|
||||
|
||||
private:
|
||||
std::string m_serviceName;
|
||||
std::string m_methodName;
|
||||
std::shared_ptr <flutter::MethodResult<flutter::EncodableValue>> m_result;
|
||||
};
|
||||
|
||||
#endif // NIMCORE
|
82
windows/src/common/FLTService.cpp
Normal file
82
windows/src/common/FLTService.cpp
Normal file
@ -0,0 +1,82 @@
|
||||
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
|
||||
// Use of this source code is governed by a MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "FLTService.h"
|
||||
|
||||
#include "../FLTConvert.h"
|
||||
#include "ThreadUtil.h"
|
||||
|
||||
std::string FLTService::getServiceName() const { return m_serviceName; }
|
||||
|
||||
void notifyEvent(const std::string& eventName,
|
||||
flutter::EncodableMap& arguments) {
|
||||
arguments.insert(std::make_pair(flutter::EncodableValue("serviceName"),
|
||||
flutter::EncodableValue("")));
|
||||
std::string strLog;
|
||||
strLog.append("en: ")
|
||||
.append(eventName)
|
||||
.append(", args: ")
|
||||
.append(Convert::getInstance()->getStringFormMapForLog(&arguments));
|
||||
std::list<std::string> logList;
|
||||
Convert::getInstance()->getLogList(strLog, logList);
|
||||
for (auto& it : logList) {
|
||||
YXLOG_API(Info) << it << YXLOGEnd;
|
||||
}
|
||||
|
||||
// Create shared pointers for the data to ensure copy constructibility
|
||||
auto eventNameCopy = std::make_shared<std::string>(eventName);
|
||||
auto argsCopy = std::make_shared<flutter::EncodableMap>(arguments);
|
||||
|
||||
// Ensure we're on the platform thread
|
||||
ThreadUtil::RunOnPlatformThread([eventNameCopy, argsCopy]() {
|
||||
NimCore::getInstance()->invokeMethod(*eventNameCopy, *argsCopy);
|
||||
YXLOG_API(Info) << "notifyEvent invoke completation." << YXLOGEnd;
|
||||
});
|
||||
}
|
||||
|
||||
//void FLTService::notifyEvent(const std::string& eventName,
|
||||
// flutter::EncodableMap& arguments,
|
||||
// const NimCore::InvokeMehtodCallback& callback) {
|
||||
// arguments.insert(std::make_pair(flutter::EncodableValue("serviceName"),
|
||||
// flutter::EncodableValue(m_serviceName)));
|
||||
// std::string strLog;
|
||||
// strLog.append("en: ")
|
||||
// .append(eventName)
|
||||
// .append(", args: ")
|
||||
// .append(Convert::getInstance()->getStringFormMapForLog(&arguments));
|
||||
// std::list<std::string> logList;
|
||||
// Convert::getInstance()->getLogList(strLog, logList);
|
||||
// for (auto& it : logList) {
|
||||
// YXLOG_API(Info) << it << YXLOGEnd;
|
||||
// }
|
||||
// NimCore::getInstance()->invokeMethod(eventName, arguments, callback);
|
||||
// YXLOG_API(Info) << "notifyEvent invoke completation." << YXLOGEnd;
|
||||
//}
|
||||
|
||||
void FLTService::notifyEventEx(const std::string& serviceName,
|
||||
const std::string& eventName,
|
||||
flutter::EncodableMap& arguments) {
|
||||
arguments.insert(std::make_pair(flutter::EncodableValue("serviceName"),
|
||||
flutter::EncodableValue(serviceName)));
|
||||
std::string strLog;
|
||||
strLog.append("en: ")
|
||||
.append(eventName)
|
||||
.append(", args: ")
|
||||
.append(Convert::getInstance()->getStringFormMapForLog(&arguments));
|
||||
std::list<std::string> logList;
|
||||
Convert::getInstance()->getLogList(strLog, logList);
|
||||
for (auto& it : logList) {
|
||||
YXLOG_API(Info) << it << YXLOGEnd;
|
||||
}
|
||||
|
||||
// Create shared pointers for the data to ensure copy constructibility
|
||||
auto eventNameCopy = std::make_shared<std::string>(eventName);
|
||||
auto argsCopy = std::make_shared<flutter::EncodableMap>(arguments);
|
||||
|
||||
// Ensure we're on the platform thread
|
||||
ThreadUtil::RunOnPlatformThread([eventNameCopy, argsCopy]() {
|
||||
NimCore::getInstance()->invokeMethod(*eventNameCopy, *argsCopy);
|
||||
YXLOG_API(Info) << "notifyEventEx invoke completation." << YXLOGEnd;
|
||||
});
|
||||
}
|
46
windows/src/common/FLTService.h
Normal file
46
windows/src/common/FLTService.h
Normal file
@ -0,0 +1,46 @@
|
||||
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
|
||||
// Use of this source code is governed by a MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLTSERVICE_H
|
||||
#define FLTSERVICE_H
|
||||
|
||||
#include "../NimCore.h"
|
||||
#include "NimResult.h"
|
||||
#include "flutter/method_result.h"
|
||||
|
||||
#define DECLARE_FUN(fun) \
|
||||
void fun(const flutter::EncodableMap* arguments, \
|
||||
FLTService::MethodResult result);
|
||||
|
||||
void notifyEvent(const std::string& eventName,
|
||||
flutter::EncodableMap& arguments);
|
||||
|
||||
class FLTService {
|
||||
public:
|
||||
using MethodResult =
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>>;
|
||||
|
||||
public:
|
||||
virtual void onMethodCalled(
|
||||
const std::string& method, const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>>
|
||||
result) = 0;
|
||||
|
||||
std::string getServiceName() const;
|
||||
|
||||
|
||||
|
||||
//void notifyEvent(const std::string& eventName,
|
||||
// flutter::EncodableMap& arguments,
|
||||
// const NimCore::InvokeMehtodCallback& callback);
|
||||
|
||||
static void notifyEventEx(const std::string& serviceName,
|
||||
const std::string& eventName,
|
||||
flutter::EncodableMap& arguments);
|
||||
|
||||
protected:
|
||||
std::string m_serviceName;
|
||||
};
|
||||
|
||||
#endif // FLTSERVICE_H
|
88
windows/src/common/NimResult.cpp
Normal file
88
windows/src/common/NimResult.cpp
Normal file
@ -0,0 +1,88 @@
|
||||
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
|
||||
// Use of this source code is governed by a MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "NimResult.h"
|
||||
|
||||
using namespace flutter;
|
||||
|
||||
EncodableValue NimResult::getErrorResult(int code, const std::string& msg) {
|
||||
EncodableMap result;
|
||||
result.insert(std::make_pair(EncodableValue("code"), EncodableValue(code)));
|
||||
result.insert(
|
||||
std::make_pair(EncodableValue("errorDetails"), EncodableValue(msg)));
|
||||
result.insert(std::make_pair(EncodableValue("data"), EncodableValue()));
|
||||
return EncodableValue(result);
|
||||
}
|
||||
|
||||
EncodableValue NimResult::getErrorResult(int code, const std::string& msg,
|
||||
const EncodableMap& data) {
|
||||
EncodableMap result;
|
||||
result.insert(std::make_pair(EncodableValue("code"), EncodableValue(code)));
|
||||
result.insert(
|
||||
std::make_pair(EncodableValue("errorDetails"), EncodableValue(msg)));
|
||||
result.insert(std::make_pair(EncodableValue("data"), EncodableValue(data)));
|
||||
return EncodableValue(result);
|
||||
}
|
||||
|
||||
EncodableValue NimResult::getSuccessResult() {
|
||||
EncodableMap result;
|
||||
result.insert(std::make_pair(EncodableValue("code"), EncodableValue(0)));
|
||||
result.insert(
|
||||
std::make_pair(EncodableValue("errorDetails"), EncodableValue("")));
|
||||
result.insert(std::make_pair(EncodableValue("data"), EncodableValue()));
|
||||
return EncodableValue(result);
|
||||
}
|
||||
|
||||
EncodableValue NimResult::getSuccessResult(bool data) {
|
||||
return getSuccessResult(EncodableValue(data));
|
||||
}
|
||||
|
||||
EncodableValue NimResult::getSuccessResult(int32_t data) {
|
||||
return getSuccessResult(EncodableValue(data));
|
||||
}
|
||||
|
||||
EncodableValue NimResult::getSuccessResult(int64_t data) {
|
||||
return getSuccessResult(EncodableValue(data));
|
||||
}
|
||||
|
||||
EncodableValue NimResult::getSuccessResult(const std::string& data) {
|
||||
return getSuccessResult(EncodableValue(data));
|
||||
}
|
||||
|
||||
EncodableValue NimResult::getSuccessResult(const EncodableValue& data) {
|
||||
EncodableMap result;
|
||||
result.insert(std::make_pair(EncodableValue("code"), EncodableValue(0)));
|
||||
result.insert(
|
||||
std::make_pair(EncodableValue("errorDetails"), EncodableValue("")));
|
||||
result.insert(std::make_pair(EncodableValue("data"), data));
|
||||
return EncodableValue(result);
|
||||
}
|
||||
|
||||
EncodableValue NimResult::getSuccessResult(const EncodableMap& data) {
|
||||
EncodableMap result;
|
||||
result.insert(std::make_pair(EncodableValue("code"), EncodableValue(0)));
|
||||
result.insert(
|
||||
std::make_pair(EncodableValue("errorDetails"), EncodableValue("")));
|
||||
result.insert(std::make_pair(EncodableValue("data"), data));
|
||||
return EncodableValue(result);
|
||||
}
|
||||
|
||||
EncodableValue NimResult::getSuccessResult(const EncodableList& data) {
|
||||
EncodableMap result;
|
||||
result.insert(std::make_pair(EncodableValue("code"), EncodableValue(0)));
|
||||
result.insert(
|
||||
std::make_pair(EncodableValue("errorDetails"), EncodableValue("")));
|
||||
result.insert(std::make_pair(EncodableValue("data"), data));
|
||||
return EncodableValue(result);
|
||||
}
|
||||
|
||||
EncodableValue NimResult::getSuccessResult(const std::string& msg,
|
||||
const EncodableMap& data) {
|
||||
EncodableMap result;
|
||||
result.insert(std::make_pair(EncodableValue("code"), EncodableValue(0)));
|
||||
result.insert(
|
||||
std::make_pair(EncodableValue("errorDetails"), EncodableValue(msg)));
|
||||
result.insert(std::make_pair(EncodableValue("data"), EncodableValue(data)));
|
||||
return EncodableValue(result);
|
||||
}
|
34
windows/src/common/NimResult.h
Normal file
34
windows/src/common/NimResult.h
Normal file
@ -0,0 +1,34 @@
|
||||
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
|
||||
// Use of this source code is governed by a MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef NIMRESULT_H
|
||||
#define NIMRESULT_H
|
||||
|
||||
#include "flutter/encodable_value.h"
|
||||
|
||||
using namespace flutter;
|
||||
|
||||
class NimResult {
|
||||
public:
|
||||
static EncodableValue getErrorResult(int code, const std::string& msg);
|
||||
static EncodableValue getErrorResult(int code, const std::string& msg,
|
||||
const flutter::EncodableMap& data);
|
||||
|
||||
static EncodableValue getSuccessResult();
|
||||
static EncodableValue getSuccessResult(bool data);
|
||||
static EncodableValue getSuccessResult(int32_t data);
|
||||
static EncodableValue getSuccessResult(int64_t data);
|
||||
static EncodableValue getSuccessResult(const std::string& data);
|
||||
static EncodableValue getSuccessResult(const flutter::EncodableValue& data);
|
||||
static EncodableValue getSuccessResult(const flutter::EncodableMap& data);
|
||||
static EncodableValue getSuccessResult(const flutter::EncodableList& data);
|
||||
static EncodableValue getSuccessResult(const std::string& msg,
|
||||
const flutter::EncodableMap& data);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // NIMRESULT_H
|
91
windows/src/common/ThreadUtil.cpp
Normal file
91
windows/src/common/ThreadUtil.cpp
Normal file
@ -0,0 +1,91 @@
|
||||
#include "ThreadUtil.h"
|
||||
#include <windows.h>
|
||||
#include <process.h>
|
||||
#include <queue>
|
||||
#include <mutex>
|
||||
#include <condition_variable>
|
||||
#include <memory>
|
||||
|
||||
namespace ThreadUtil {
|
||||
// Global variables for thread management
|
||||
static DWORD g_platformThreadId = 0;
|
||||
static std::queue<std::function<void()>> g_taskQueue;
|
||||
static std::mutex g_queueMutex;
|
||||
static std::condition_variable g_queueCondition;
|
||||
static bool g_initialized = false;
|
||||
static HANDLE g_workerThread = NULL;
|
||||
// Worker thread function
|
||||
unsigned __stdcall WorkerThreadProc(void* param) {
|
||||
while (true) {
|
||||
std::function<void()> task;
|
||||
|
||||
{
|
||||
std::unique_lock<std::mutex> lock(g_queueMutex);
|
||||
g_queueCondition.wait(lock, [] { return !g_taskQueue.empty(); });
|
||||
task = g_taskQueue.front();
|
||||
g_taskQueue.pop();
|
||||
}
|
||||
|
||||
// Execute the task
|
||||
task();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
// Function to initialize the platform thread ID
|
||||
void InitializePlatformThreadId() {
|
||||
g_platformThreadId = GetCurrentThreadId();
|
||||
|
||||
// Create worker thread
|
||||
g_workerThread = (HANDLE)_beginthreadex(NULL, 0, WorkerThreadProc, NULL, 0, NULL);
|
||||
g_initialized = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Function to ensure code runs on the platform thread
|
||||
void RunOnPlatformThread(std::function<void()> callback) {
|
||||
// Initialize on first call
|
||||
if (!g_initialized) {
|
||||
InitializePlatformThreadId();
|
||||
|
||||
|
||||
}
|
||||
|
||||
// If we're already on the platform thread, execute directly
|
||||
if (GetCurrentThreadId() == g_platformThreadId) {
|
||||
callback();
|
||||
return;
|
||||
}
|
||||
|
||||
// Create a shared_ptr to the callback to ensure it's copy constructible
|
||||
auto callbackPtr = std::make_shared<std::function<void()>>(std::move(callback));
|
||||
|
||||
// Otherwise, queue the task for execution on the platform thread
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(g_queueMutex);
|
||||
g_taskQueue.push([callbackPtr]() { (*callbackPtr)(); });
|
||||
}
|
||||
g_queueCondition.notify_one();
|
||||
}
|
||||
|
||||
// Helper function to invoke method on platform thread
|
||||
void InvokeMethodOnPlatformThread(
|
||||
flutter::MethodChannel<flutter::EncodableValue>* channel,
|
||||
const std::string& method,
|
||||
std::unique_ptr<flutter::EncodableValue> arguments) {
|
||||
|
||||
if (!channel) return;
|
||||
|
||||
// Create shared pointers for the data to ensure copy constructibility
|
||||
auto methodCopy = std::make_shared<std::string>(method);
|
||||
auto argsCopy = std::shared_ptr<flutter::EncodableValue>(arguments.release());
|
||||
|
||||
RunOnPlatformThread([channel, methodCopy, argsCopy]() {
|
||||
channel->InvokeMethod(
|
||||
*methodCopy,
|
||||
std::make_unique<flutter::EncodableValue>(*argsCopy)
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
20
windows/src/common/ThreadUtil.h
Normal file
20
windows/src/common/ThreadUtil.h
Normal file
@ -0,0 +1,20 @@
|
||||
#pragma once
|
||||
|
||||
#include <functional>
|
||||
#include <windows.h>
|
||||
#include <flutter/method_channel.h>
|
||||
#include <flutter/encodable_value.h>
|
||||
|
||||
namespace ThreadUtil {
|
||||
// Function to initialize the platform thread ID
|
||||
void InitializePlatformThreadId();
|
||||
|
||||
// Function to ensure code runs on the platform thread
|
||||
void RunOnPlatformThread(std::function<void()> callback);
|
||||
|
||||
// Helper function to invoke method on platform thread
|
||||
void InvokeMethodOnPlatformThread(
|
||||
flutter::MethodChannel<flutter::EncodableValue>* channel,
|
||||
const std::string& method,
|
||||
std::unique_ptr<flutter::EncodableValue> arguments);
|
||||
}
|
74
windows/src/common/ZegoDataUtils.cpp
Normal file
74
windows/src/common/ZegoDataUtils.cpp
Normal file
@ -0,0 +1,74 @@
|
||||
#include "ZegoDataUtils.h"
|
||||
|
||||
bool zego_value_is_null(flutter::EncodableValue value) { return value.IsNull(); }
|
||||
|
||||
int32_t zego_value_get_int(flutter::EncodableValue value) {
|
||||
// dart 没有 int32_t int64_t 区分,这里处理了 int32 最高位为 1(负数)的 case
|
||||
return (int32_t)zego_value_get_long(value);
|
||||
}
|
||||
|
||||
int64_t zego_value_get_long(flutter::EncodableValue value) { return value.LongValue(); }
|
||||
|
||||
bool zego_value_get_bool(flutter::EncodableValue value) { return std::get<bool>(value); }
|
||||
|
||||
double zego_value_get_double(flutter::EncodableValue value) { return std::get<double>(value); }
|
||||
|
||||
std::string zego_value_get_string(flutter::EncodableValue value) {
|
||||
return std::get<std::string>(value);
|
||||
}
|
||||
|
||||
std::vector<float> zego_value_get_vector_float(flutter::EncodableValue value) {
|
||||
return std::get<std::vector<float>>(value);
|
||||
}
|
||||
|
||||
std::vector<uint8_t> zego_value_get_vector_uint8(flutter::EncodableValue value) {
|
||||
return std::get<std::vector<uint8_t>>(value);
|
||||
}
|
||||
|
||||
ZFMap zego_value_get_map(flutter::EncodableValue value) { return std::get<ZFMap>(value); }
|
||||
|
||||
ZFArray zego_value_get_list(flutter::EncodableValue value) { return std::get<ZFArray>(value); }
|
||||
|
||||
|
||||
// 将 EncodableValue 转换为 nlohmann::json
|
||||
nlohmann::json EncodableValueToJson(const flutter::EncodableValue& value) {
|
||||
if (std::holds_alternative<bool>(value)) {
|
||||
return std::get<bool>(value);
|
||||
} else if (std::holds_alternative<int32_t>(value)) {
|
||||
return std::get<int32_t>(value);
|
||||
} else if (std::holds_alternative<int64_t>(value)) {
|
||||
return std::get<int64_t>(value);
|
||||
} else if (std::holds_alternative<double>(value)) {
|
||||
return std::get<double>(value);
|
||||
} else if (std::holds_alternative<std::string>(value)) {
|
||||
return std::get<std::string>(value);
|
||||
} else if (std::holds_alternative<flutter::EncodableList>(value)) {
|
||||
nlohmann::json json_array = nlohmann::json::array();
|
||||
for (const auto& item : std::get<flutter::EncodableList>(value)) {
|
||||
json_array.push_back(EncodableValueToJson(item));
|
||||
}
|
||||
return json_array;
|
||||
} else if (std::holds_alternative<flutter::EncodableMap>(value)) {
|
||||
nlohmann::json json_object = nlohmann::json::object();
|
||||
for (const auto& pair : std::get<flutter::EncodableMap>(value)) {
|
||||
std::string key = std::get<std::string>(pair.first); // 假设键是字符串
|
||||
json_object[key] = EncodableValueToJson(pair.second);
|
||||
}
|
||||
return json_object;
|
||||
}
|
||||
return nullptr; // 处理空值或不支持的类型
|
||||
}
|
||||
|
||||
// 将 EncodableMap 转换为 JSON 字符串
|
||||
std::string map_2_json(const flutter::EncodableMap& map) {
|
||||
nlohmann::json json_object = nlohmann::json::object();
|
||||
for (const auto& pair : map) {
|
||||
std::string key = std::get<std::string>(pair.first); // 假设键是字符串
|
||||
json_object[key] = EncodableValueToJson(pair.second);
|
||||
}
|
||||
auto json_string = json_object.dump(); // 序列化为 JSON 字符串
|
||||
return json_string; // 序列化为 JSON 字符串
|
||||
}
|
||||
std::string value_2_json(flutter::EncodableValue value){
|
||||
return EncodableValueToJson(value).dump();
|
||||
}
|
36
windows/src/common/ZegoDataUtils.h
Normal file
36
windows/src/common/ZegoDataUtils.h
Normal file
@ -0,0 +1,36 @@
|
||||
#pragma once
|
||||
|
||||
#include <flutter/encodable_value.h>
|
||||
#include <flutter/event_channel.h>
|
||||
#include <memory>
|
||||
#include "json.hpp"
|
||||
|
||||
#define ZFValue(varName) flutter::EncodableValue(varName)
|
||||
#define ZFMap flutter::EncodableMap
|
||||
#define ZFArray flutter::EncodableList
|
||||
|
||||
#define ZFArgument flutter::EncodableMap &
|
||||
#define ZFResult std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>>
|
||||
#define ZFEventSink std::unique_ptr<flutter::EventSink<flutter::EncodableValue>>
|
||||
#define ZFMoveResult(result) std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>>(std::move(result))
|
||||
|
||||
#define ZFPluginRegistrar flutter::PluginRegistrarWindows
|
||||
#define ZFBinaryMessenger flutter::BinaryMessenger
|
||||
#define ZFTextureRegistrar flutter::TextureRegistrar
|
||||
|
||||
bool zego_value_is_null(flutter::EncodableValue value);
|
||||
|
||||
int32_t zego_value_get_int(flutter::EncodableValue value);
|
||||
int64_t zego_value_get_long(flutter::EncodableValue value);
|
||||
bool zego_value_get_bool(flutter::EncodableValue value);
|
||||
double zego_value_get_double(flutter::EncodableValue value);
|
||||
std::string zego_value_get_string(flutter::EncodableValue value);
|
||||
|
||||
std::vector<float> zego_value_get_vector_float(flutter::EncodableValue value);
|
||||
std::vector<uint8_t> zego_value_get_vector_uint8(flutter::EncodableValue value);
|
||||
ZFMap zego_value_get_map(flutter::EncodableValue value);
|
||||
ZFArray zego_value_get_list(flutter::EncodableValue value);
|
||||
std::string map_2_json(const flutter::EncodableMap& map);
|
||||
std::string value_2_json(flutter::EncodableValue value);
|
||||
nlohmann::json EncodableValueToJson(const flutter::EncodableValue& value);
|
||||
|
25526
windows/src/common/json.hpp
Normal file
25526
windows/src/common/json.hpp
Normal file
File diff suppressed because it is too large
Load Diff
201
windows/src/common/services/ChannelManager.cpp
Normal file
201
windows/src/common/services/ChannelManager.cpp
Normal file
@ -0,0 +1,201 @@
|
||||
#include "ChannelManager.h"
|
||||
#include <libopenimsdk.h>
|
||||
#include "../NimResult.h"
|
||||
#include "../ZegoDataUtils.h"
|
||||
#include "ConstDefine.h"
|
||||
#include "Listen.h"
|
||||
|
||||
ChannelManagerService::ChannelManagerService() {
|
||||
m_serviceName = "channelManager";
|
||||
}
|
||||
|
||||
void ChannelManagerService::onMethodCalled(
|
||||
const std::string& method,
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (method == "setChannelListener") {
|
||||
setChannelListener(arguments, result);
|
||||
} else if (method == "getChannelMembersInfo") {
|
||||
getChannelMembersInfo(arguments, result);
|
||||
} else if (method == "getChannelMemberList") {
|
||||
getChannelMemberList(arguments, result);
|
||||
} else if (method == "getChannelsInfo") {
|
||||
getChannelsInfo(arguments, result);
|
||||
} else if (method == "joinChannel") {
|
||||
joinChannel(arguments, result);
|
||||
} else if (method == "quitChannel") {
|
||||
quitChannel(arguments, result);
|
||||
} else if (method == "changeChannelMute") {
|
||||
changeChannelMute(arguments, result);
|
||||
} else if (method == "changeChannelMemberMute") {
|
||||
changeChannelMemberMute(arguments, result);
|
||||
} else if (method == "isJoinChannel") {
|
||||
isJoinChannel(arguments, result);
|
||||
} else if (method == "getUsersInChannel") {
|
||||
getUsersInChannel(arguments, result);
|
||||
} else {
|
||||
result->NotImplemented();
|
||||
}
|
||||
}
|
||||
|
||||
void ChannelManagerService::setChannelListener(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
set_channel_listener(NewChannelListenCallBack());
|
||||
result->Success(flutter::EncodableValue());
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ChannelManagerService::getChannelMembersInfo(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto channelID = zego_value_get_string(arguments->at(flutter::EncodableValue("channelID")));
|
||||
auto userIDList = value_2_json(arguments->at(flutter::EncodableValue("userIDList")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* channelID_cs = const_cast<char*>(channelID.c_str());
|
||||
char* userIDList_cs = const_cast<char*>(userIDList.c_str());
|
||||
|
||||
get_specified_channel_members_info(NewBaseCallBack(result), operationID_cs, channelID_cs, userIDList_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ChannelManagerService::getChannelMemberList(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto channelID = zego_value_get_string(arguments->at(flutter::EncodableValue("channelID")));
|
||||
auto filter = zego_value_get_int(arguments->at(flutter::EncodableValue("filter")));
|
||||
auto offset = zego_value_get_int(arguments->at(flutter::EncodableValue("offset")));
|
||||
auto count = zego_value_get_int(arguments->at(flutter::EncodableValue("count")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* channelID_cs = const_cast<char*>(channelID.c_str());
|
||||
|
||||
get_channel_member_list(NewBaseCallBack(result), operationID_cs, channelID_cs, filter, offset, count);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ChannelManagerService::getChannelsInfo(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto channelIDList = value_2_json(arguments->at(flutter::EncodableValue("channelIDList")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* channelIDList_cs = const_cast<char*>(channelIDList.c_str());
|
||||
|
||||
get_specified_channels_info(NewBaseCallBack(result), operationID_cs, channelIDList_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ChannelManagerService::joinChannel(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto channelID = zego_value_get_string(arguments->at(flutter::EncodableValue("channelID")));
|
||||
auto reason = zego_value_get_string(arguments->at(flutter::EncodableValue("reason")));
|
||||
auto joinSource = zego_value_get_int(arguments->at(flutter::EncodableValue("joinSource")));
|
||||
auto ex = zego_value_get_string(arguments->at(flutter::EncodableValue("ex")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* channelID_cs = const_cast<char*>(channelID.c_str());
|
||||
char* reason_cs = const_cast<char*>(reason.c_str());
|
||||
char* ex_cs = const_cast<char*>(ex.c_str());
|
||||
|
||||
join_channel(NewBaseCallBack(result), operationID_cs, channelID_cs, reason_cs, joinSource, ex_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ChannelManagerService::quitChannel(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto channelID = zego_value_get_string(arguments->at(flutter::EncodableValue("channelID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* channelID_cs = const_cast<char*>(channelID.c_str());
|
||||
|
||||
quit_channel(NewBaseCallBack(result), operationID_cs, channelID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ChannelManagerService::changeChannelMute(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
// if (arguments) {
|
||||
// auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
// auto channelID = zego_value_get_string(arguments->at(flutter::EncodableValue("channelID")));
|
||||
// auto mute = zego_value_get_bool(arguments->at(flutter::EncodableValue("mute")));
|
||||
// char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
// char* channelID_cs = const_cast<char*>(channelID.c_str());
|
||||
|
||||
// change_channel_mute(NewBaseCallBack(result), operationID_cs, channelID_cs, mute);
|
||||
// } else {
|
||||
// result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
// }
|
||||
}
|
||||
|
||||
void ChannelManagerService::changeChannelMemberMute(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
// if (arguments) {
|
||||
// auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
// auto channelID = zego_value_get_string(arguments->at(flutter::EncodableValue("channelID")));
|
||||
// auto userID = zego_value_get_string(arguments->at(flutter::EncodableValue("userID")));
|
||||
// auto seconds = zego_value_get_int(arguments->at(flutter::EncodableValue("seconds")));
|
||||
// char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
// char* channelID_cs = const_cast<char*>(channelID.c_str());
|
||||
// char* userID_cs = const_cast<char*>(userID.c_str());
|
||||
|
||||
// change_channel_member_mute(NewBaseCallBack(result), operationID_cs, channelID_cs, userID_cs, seconds);
|
||||
// } else {
|
||||
// result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
// }
|
||||
}
|
||||
|
||||
void ChannelManagerService::isJoinChannel(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto channelID = zego_value_get_string(arguments->at(flutter::EncodableValue("channelID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* channelID_cs = const_cast<char*>(channelID.c_str());
|
||||
|
||||
is_join_channel(NewBaseCallBack(result), operationID_cs, channelID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ChannelManagerService::getUsersInChannel(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto channelID = zego_value_get_string(arguments->at(flutter::EncodableValue("channelID")));
|
||||
auto userIDs = value_2_json(arguments->at(flutter::EncodableValue("userIDs")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* channelID_cs = const_cast<char*>(channelID.c_str());
|
||||
char* userIDs_cs = const_cast<char*>(userIDs.c_str());
|
||||
|
||||
get_users_in_channel(NewBaseCallBack(result), operationID_cs, channelID_cs, userIDs_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
55
windows/src/common/services/ChannelManager.h
Normal file
55
windows/src/common/services/ChannelManager.h
Normal file
@ -0,0 +1,55 @@
|
||||
#ifndef CHANNEL_MANAGER_SERVICE_H
|
||||
#define CHANNEL_MANAGER_SERVICE_H
|
||||
#include "../FLTService.h"
|
||||
#include "Listen.h"
|
||||
#include <flutter/standard_method_codec.h>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
class ChannelManagerService : public FLTService
|
||||
{
|
||||
|
||||
public:
|
||||
ChannelManagerService();
|
||||
|
||||
virtual void onMethodCalled(
|
||||
const std::string& method, const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
override;
|
||||
|
||||
// Method handlers
|
||||
void setChannelListener(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getChannelMembersInfo(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getChannelMemberList(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getChannelsInfo(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void joinChannel(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void quitChannel(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void changeChannelMute(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void changeChannelMemberMute(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void isJoinChannel(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getUsersInChannel(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif // CHANNEL_MANAGER_SERVICE_H
|
87
windows/src/common/services/ConstDefine.h
Normal file
87
windows/src/common/services/ConstDefine.h
Normal file
@ -0,0 +1,87 @@
|
||||
#ifndef CONST_DEFINE_H
|
||||
#define CONST_DEFINE_H
|
||||
|
||||
enum class ConstDefine {
|
||||
CONNECTING = 0,
|
||||
CONNECT_SUCCESS,
|
||||
CONNECT_FAILED,
|
||||
KICKED_OFFLINE,
|
||||
USER_TOKEN_EXPIRED,
|
||||
JOINED_GROUP_ADDED,
|
||||
JOINED_GROUP_DELETED,
|
||||
GROUP_MEMBER_ADDED,
|
||||
GROUP_MEMBER_DELETED,
|
||||
GROUP_APPLICATION_ADDED,
|
||||
GROUP_APPLICATION_DELETED,
|
||||
GROUP_INFO_CHANGED,
|
||||
GROUP_DISMISSED,
|
||||
GROUP_MEMBER_INFO_CHANGED,
|
||||
GROUP_APPLICATION_ACCEPTED,
|
||||
GROUP_APPLICATION_REJECTED,
|
||||
FRIEND_APPLICATION_ADDED,
|
||||
FRIEND_APPLICATION_DELETED,
|
||||
FRIEND_APPLICATION_ACCEPTED,
|
||||
FRIEND_APPLICATION_REJECTED,
|
||||
FRIEND_ADDED,
|
||||
FRIEND_DELETED,
|
||||
FRIEND_INFO_CHANGED,
|
||||
BLACK_ADDED,
|
||||
BLACK_DELETED,
|
||||
SYNC_SERVER_START,
|
||||
SYNC_SERVER_FINISH,
|
||||
SYNC_SERVER_PROGRESS,
|
||||
SYNC_SERVER_FAILED,
|
||||
NEW_CONVERSATION,
|
||||
CONVERSATION_CHANGED,
|
||||
TOTAL_UNREAD_MESSAGE_COUNT_CHANGED,
|
||||
RECV_NEW_MESSAGE,
|
||||
RECV_C2C_READ_RECEIPT,
|
||||
RECV_GROUP_READ_RECEIPT,
|
||||
NEW_RECV_MESSAGE_REVOKED,
|
||||
RECV_MESSAGE_EXTENSIONS_CHANGED,
|
||||
RECV_MESSAGE_EXTENSIONS_DELETED,
|
||||
RECV_MESSAGE_EXTENSIONS_ADDED,
|
||||
RECV_OFFLINE_NEW_MESSAGE,
|
||||
MSG_DELETED,
|
||||
RECV_NEW_MESSAGES,
|
||||
RECV_OFFLINE_NEW_MESSAGES,
|
||||
|
||||
SELF_INFO_UPDATED,
|
||||
USER_STATUS_CHANGED,
|
||||
|
||||
RECV_CUSTOM_BUSINESS_MESSAGE,
|
||||
|
||||
MESSAGE_KV_INFO_CHANGED,
|
||||
|
||||
OPEN,
|
||||
PART_SIZE,
|
||||
HASH_PART_PROGRESS,
|
||||
HASH_PART_COMPLETE,
|
||||
UPLOAD_ID,
|
||||
UPLOAD_PART_COMPLETE,
|
||||
UPLOAD_COMPLETE,
|
||||
COMPLETE,
|
||||
CONVERSATION_USER_INPUT_STATUS_CHANGED,
|
||||
RECV_ONLINE_ONLY_MESSAGE,
|
||||
NEW_RECV_MESSAGE_EDIT,
|
||||
|
||||
USER_TOKEN_INVALID,
|
||||
|
||||
ON_PROGRESS,
|
||||
JOINED_CHANNEL_ADDED,
|
||||
JOINED_CHANNEL_DELETED,
|
||||
CHANNEL_MEMBER_ADDED,
|
||||
CHANNEL_MEMBER_DELETED,
|
||||
CHANNEL_APPLICATION_ADDED,
|
||||
CHANNEL_APPLICATION_DELETED,
|
||||
CHANNEL_INFO_CHANGED,
|
||||
CHANNEL_DISMISSED,
|
||||
CHANNEL_MEMBER_INFO_CHANGED,
|
||||
CHANNEL_APPLICATION_ACCEPTED,
|
||||
CHANNEL_APPLICATION_REJECTED,
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // EVENT_TYPES_H
|
341
windows/src/common/services/ConversationManager.cpp
Normal file
341
windows/src/common/services/ConversationManager.cpp
Normal file
@ -0,0 +1,341 @@
|
||||
#include "ConversationManager.h"
|
||||
#include <libopenimsdk.h>
|
||||
#include "../NimResult.h"
|
||||
#include "../ZegoDataUtils.h"
|
||||
#include "ConstDefine.h"
|
||||
#include "Listen.h"
|
||||
|
||||
ConversationManagerService::ConversationManagerService() {
|
||||
m_serviceName = "conversationManager";
|
||||
}
|
||||
|
||||
void ConversationManagerService::onMethodCalled(
|
||||
const std::string& method,
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (method == "setConversationListener") {
|
||||
setConversationListener(arguments, result);
|
||||
} else if (method == "getAllConversationList") {
|
||||
getAllConversationList(arguments, result);
|
||||
} else if (method == "getConversationListSplit") {
|
||||
getConversationListSplit(arguments, result);
|
||||
} else if (method == "getOneConversation") {
|
||||
getOneConversation(arguments, result);
|
||||
} else if (method == "getMultipleConversation") {
|
||||
getMultipleConversation(arguments, result);
|
||||
} else if (method == "setConversationDraft") {
|
||||
setConversationDraft(arguments, result);
|
||||
} else if (method == "hideConversation") {
|
||||
hideConversation(arguments, result);
|
||||
} else if (method == "markConversationMessageAsRead") {
|
||||
markConversationMessageAsRead(arguments, result);
|
||||
} else if (method == "getTotalUnreadMsgCount") {
|
||||
getTotalUnreadMsgCount(arguments, result);
|
||||
} else if (method == "getConversationIDBySessionType") {
|
||||
getConversationIDBySessionType(arguments, result);
|
||||
} else if (method == "clearConversationAndDeleteAllMsg") {
|
||||
clearConversationAndDeleteAllMsg(arguments, result);
|
||||
} else if (method == "deleteConversationAndDeleteAllMsg") {
|
||||
deleteConversationAndDeleteAllMsg(arguments, result);
|
||||
} else if (method == "getAtAllTag") {
|
||||
getAtAllTag(arguments, result);
|
||||
} else if (method == "hideAllConversations") {
|
||||
hideAllConversations(arguments, result);
|
||||
} else if (method == "searchConversation") {
|
||||
searchConversation(arguments, result);
|
||||
} else if (method == "changeInputStates") {
|
||||
changeInputStates(arguments, result);
|
||||
} else if (method == "getInputStates") {
|
||||
getInputStates(arguments, result);
|
||||
} else if (method == "setConversation") {
|
||||
setConversation(arguments, result);
|
||||
} else if (method == "searchConversations") {
|
||||
searchConversations(arguments, result);
|
||||
} else {
|
||||
result->NotImplemented();
|
||||
}
|
||||
}
|
||||
|
||||
void ConversationManagerService::setConversationListener(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
set_conversation_listener(NewConversationListenerCallBack());
|
||||
result->Success(flutter::EncodableValue());
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ConversationManagerService::getAllConversationList(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
|
||||
get_all_conversation_list(NewBaseCallBack(result), operationID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ConversationManagerService::getConversationListSplit(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto offset = zego_value_get_int(arguments->at(flutter::EncodableValue("offset")));
|
||||
auto count = zego_value_get_int(arguments->at(flutter::EncodableValue("count")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
|
||||
get_conversation_list_split(NewBaseCallBack(result), operationID_cs, offset, count);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ConversationManagerService::getOneConversation(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto sessionType = zego_value_get_int(arguments->at(flutter::EncodableValue("sessionType")));
|
||||
auto sourceID = zego_value_get_string(arguments->at(flutter::EncodableValue("sourceID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* sourceID_cs = const_cast<char*>(sourceID.c_str());
|
||||
|
||||
get_one_conversation(NewBaseCallBack(result), operationID_cs, sessionType, sourceID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ConversationManagerService::getMultipleConversation(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto conversationIDList = value_2_json(arguments->at(flutter::EncodableValue("conversationIDList")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* conversationIDList_cs = const_cast<char*>(conversationIDList.c_str());
|
||||
|
||||
get_multiple_conversation(NewBaseCallBack(result), operationID_cs, conversationIDList_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ConversationManagerService::setConversationDraft(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
|
||||
auto draftText = zego_value_get_string(arguments->at(flutter::EncodableValue("draftText")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
|
||||
char* draftText_cs = const_cast<char*>(draftText.c_str());
|
||||
|
||||
set_conversation_draft(NewBaseCallBack(result), operationID_cs, conversationID_cs, draftText_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ConversationManagerService::hideConversation(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
|
||||
|
||||
hide_conversation(NewBaseCallBack(result), operationID_cs, conversationID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ConversationManagerService::markConversationMessageAsRead(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
|
||||
|
||||
mark_conversation_message_as_read(NewBaseCallBack(result), operationID_cs, conversationID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ConversationManagerService::getTotalUnreadMsgCount(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
|
||||
get_total_unread_msg_count(NewBaseCallBack(result), operationID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ConversationManagerService::getConversationIDBySessionType(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto sourceID = zego_value_get_string(arguments->at(flutter::EncodableValue("sourceID")));
|
||||
auto sessionType = zego_value_get_int(arguments->at(flutter::EncodableValue("sessionType")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* sourceID_cs = const_cast<char*>(sourceID.c_str());
|
||||
|
||||
std::string conversationID = get_conversation_id_by_session_type(operationID_cs, sourceID_cs, sessionType);
|
||||
result->Success(flutter::EncodableValue(conversationID));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ConversationManagerService::clearConversationAndDeleteAllMsg(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
|
||||
|
||||
clear_conversation_and_delete_all_msg(NewBaseCallBack(result), operationID_cs, conversationID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ConversationManagerService::deleteConversationAndDeleteAllMsg(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
|
||||
|
||||
delete_conversation_and_delete_all_msg(NewBaseCallBack(result), operationID_cs, conversationID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ConversationManagerService::getAtAllTag(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
|
||||
std::string tag = get_at_all_tag(operationID_cs);
|
||||
result->Success(flutter::EncodableValue(tag));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ConversationManagerService::hideAllConversations(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
|
||||
hide_all_conversations(NewBaseCallBack(result), operationID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ConversationManagerService::searchConversation(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto name = zego_value_get_string(arguments->at(flutter::EncodableValue("name")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* name_cs = const_cast<char*>(name.c_str());
|
||||
|
||||
search_conversation(NewBaseCallBack(result), operationID_cs, name_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ConversationManagerService::changeInputStates(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
|
||||
auto focus = zego_value_get_bool(arguments->at(flutter::EncodableValue("focus")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
|
||||
|
||||
change_input_states(NewBaseCallBack(result), operationID_cs, conversationID_cs, focus);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ConversationManagerService::getInputStates(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
|
||||
auto userID = zego_value_get_string(arguments->at(flutter::EncodableValue("userID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
|
||||
char* userID_cs = const_cast<char*>(userID.c_str());
|
||||
|
||||
get_input_states(NewBaseCallBack(result), operationID_cs, conversationID_cs, userID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ConversationManagerService::setConversation(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
|
||||
auto req = value_2_json(arguments->at(flutter::EncodableValue("req")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
|
||||
char* req_cs = const_cast<char*>(req.c_str());
|
||||
|
||||
set_conversation(NewBaseCallBack(result), operationID_cs, conversationID_cs, req_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void ConversationManagerService::searchConversations(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto name = zego_value_get_string(arguments->at(flutter::EncodableValue("name")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* name_cs = const_cast<char*>(name.c_str());
|
||||
|
||||
search_conversations(NewBaseCallBack(result), operationID_cs, name_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
81
windows/src/common/services/ConversationManager.h
Normal file
81
windows/src/common/services/ConversationManager.h
Normal file
@ -0,0 +1,81 @@
|
||||
#ifndef CONVERSATION_MANAGER_SERVICE_H
|
||||
#define CONVERSATION_MANAGER_SERVICE_H
|
||||
#include "../FLTService.h"
|
||||
#include "Listen.h"
|
||||
#include <flutter/standard_method_codec.h>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
class ConversationManagerService : public FLTService {
|
||||
public:
|
||||
ConversationManagerService();
|
||||
|
||||
|
||||
virtual void onMethodCalled(
|
||||
const std::string& method, const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
override;
|
||||
|
||||
// Method handlers
|
||||
void setConversationListener(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getAllConversationList(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getConversationListSplit(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getOneConversation(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getMultipleConversation(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void setConversationDraft(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void hideConversation(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void markConversationMessageAsRead(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getTotalUnreadMsgCount(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getConversationIDBySessionType(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void clearConversationAndDeleteAllMsg(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void deleteConversationAndDeleteAllMsg(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getAtAllTag(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void hideAllConversations(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void searchConversation(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void changeInputStates(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getInputStates(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void setConversation(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void searchConversations(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif // CONVERSATION_MANAGER_SERVICE_H
|
383
windows/src/common/services/FriendManager.cpp
Normal file
383
windows/src/common/services/FriendManager.cpp
Normal file
@ -0,0 +1,383 @@
|
||||
#include "FriendManager.h"
|
||||
#include <libopenimsdk.h>
|
||||
#include "../NimResult.h"
|
||||
#include "../ZegoDataUtils.h"
|
||||
#include "ConstDefine.h"
|
||||
#include "Listen.h"
|
||||
|
||||
FriendshipManagerService::FriendshipManagerService()
|
||||
{
|
||||
m_serviceName = "friendshipManager";
|
||||
}
|
||||
|
||||
void FriendshipManagerService::onMethodCalled(
|
||||
const std::string &method,
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
{
|
||||
if (method == "setFriendListener")
|
||||
{
|
||||
setFriendListener(arguments, result);
|
||||
}
|
||||
else if (method == "getFriendsInfo")
|
||||
{
|
||||
getFriendsInfo(arguments, result);
|
||||
}
|
||||
else if (method == "addFriend")
|
||||
{
|
||||
addFriend(arguments, result);
|
||||
}
|
||||
else if (method == "getFriendApplicationListAsRecipient")
|
||||
{
|
||||
getFriendApplicationListAsRecipient(arguments, result);
|
||||
}
|
||||
else if (method == "getFriendApplicationListAsApplicant")
|
||||
{
|
||||
getFriendApplicationListAsApplicant(arguments, result);
|
||||
}
|
||||
else if (method == "getFriendList")
|
||||
{
|
||||
getFriendList(arguments, result);
|
||||
}
|
||||
else if (method == "getFriendListPage")
|
||||
{
|
||||
getFriendListPage(arguments, result);
|
||||
}
|
||||
else if (method == "addBlacklist")
|
||||
{
|
||||
addBlacklist(arguments, result);
|
||||
}
|
||||
else if (method == "getBlacklist")
|
||||
{
|
||||
getBlacklist(arguments, result);
|
||||
}
|
||||
else if (method == "removeBlacklist")
|
||||
{
|
||||
removeBlacklist(arguments, result);
|
||||
}
|
||||
else if (method == "checkFriend")
|
||||
{
|
||||
checkFriend(arguments, result);
|
||||
}
|
||||
else if (method == "deleteFriend")
|
||||
{
|
||||
deleteFriend(arguments, result);
|
||||
}
|
||||
else if (method == "acceptFriendApplication")
|
||||
{
|
||||
acceptFriendApplication(arguments, result);
|
||||
}
|
||||
else if (method == "refuseFriendApplication")
|
||||
{
|
||||
refuseFriendApplication(arguments, result);
|
||||
}
|
||||
else if (method == "searchFriends")
|
||||
{
|
||||
searchFriends(arguments, result);
|
||||
}
|
||||
else if (method == "updateFriends")
|
||||
{
|
||||
updateFriends(arguments, result);
|
||||
}
|
||||
else
|
||||
{
|
||||
result->NotImplemented();
|
||||
}
|
||||
}
|
||||
|
||||
void FriendshipManagerService::setFriendListener(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
{
|
||||
if (arguments)
|
||||
{
|
||||
set_friend_listener(NewFriendshipListenCallBack());
|
||||
result->Success(flutter::EncodableValue());
|
||||
}
|
||||
else
|
||||
{
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void FriendshipManagerService::getFriendsInfo(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
{
|
||||
if (arguments)
|
||||
{
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto userIDList = value_2_json(arguments->at(flutter::EncodableValue("userIDList")));
|
||||
auto filterBlack = zego_value_get_bool(arguments->at(flutter::EncodableValue("filterBlack")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
char *userIDList_cs = const_cast<char *>(userIDList.c_str());
|
||||
|
||||
get_specified_friends_info(NewBaseCallBack(result), operationID_cs, userIDList_cs, filterBlack);
|
||||
}
|
||||
else
|
||||
{
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void FriendshipManagerService::addFriend(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
{
|
||||
if (arguments)
|
||||
{
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto friendInfo = map_2_json(*arguments);
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
char *friendInfo_cs = const_cast<char *>(friendInfo.c_str());
|
||||
|
||||
add_friend(NewBaseCallBack(result), operationID_cs, friendInfo_cs);
|
||||
}
|
||||
else
|
||||
{
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void FriendshipManagerService::getFriendApplicationListAsRecipient(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
{
|
||||
if (arguments)
|
||||
{
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
|
||||
get_friend_application_list_as_recipient(NewBaseCallBack(result), operationID_cs);
|
||||
}
|
||||
else
|
||||
{
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void FriendshipManagerService::getFriendApplicationListAsApplicant(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
{
|
||||
if (arguments)
|
||||
{
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
|
||||
get_friend_application_list_as_applicant(NewBaseCallBack(result), operationID_cs);
|
||||
}
|
||||
else
|
||||
{
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void FriendshipManagerService::getFriendList(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
{
|
||||
if (arguments)
|
||||
{
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto filterBlack = zego_value_get_bool(arguments->at(flutter::EncodableValue("filterBlack")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
|
||||
get_friend_list(NewBaseCallBack(result), operationID_cs, filterBlack);
|
||||
}
|
||||
else
|
||||
{
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void FriendshipManagerService::getFriendListPage(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
{
|
||||
if (arguments)
|
||||
{
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto offset = zego_value_get_int(arguments->at(flutter::EncodableValue("offset")));
|
||||
auto count = zego_value_get_int(arguments->at(flutter::EncodableValue("count")));
|
||||
auto filterBlack = zego_value_get_bool(arguments->at(flutter::EncodableValue("filterBlack")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
|
||||
get_friend_list_page(NewBaseCallBack(result), operationID_cs, offset, count, filterBlack);
|
||||
}
|
||||
else
|
||||
{
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void FriendshipManagerService::addBlacklist(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
{
|
||||
if (arguments)
|
||||
{
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto userID = zego_value_get_string(arguments->at(flutter::EncodableValue("userID")));
|
||||
auto ex = zego_value_get_string(arguments->at(flutter::EncodableValue("ex")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
char *userID_cs = const_cast<char *>(userID.c_str());
|
||||
char *ex_cs = const_cast<char *>(ex.c_str());
|
||||
|
||||
add_black(NewBaseCallBack(result), operationID_cs, userID_cs, ex_cs);
|
||||
}
|
||||
else
|
||||
{
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void FriendshipManagerService::getBlacklist(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
{
|
||||
if (arguments)
|
||||
{
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
|
||||
get_black_list(NewBaseCallBack(result), operationID_cs);
|
||||
}
|
||||
else
|
||||
{
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void FriendshipManagerService::removeBlacklist(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
{
|
||||
if (arguments)
|
||||
{
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto userID = zego_value_get_string(arguments->at(flutter::EncodableValue("userID")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
char *userID_cs = const_cast<char *>(userID.c_str());
|
||||
|
||||
remove_black(NewBaseCallBack(result), operationID_cs, userID_cs);
|
||||
}
|
||||
else
|
||||
{
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void FriendshipManagerService::checkFriend(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
{
|
||||
if (arguments)
|
||||
{
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto userIDList = value_2_json(arguments->at(flutter::EncodableValue("userIDList")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
char *userIDList_cs = const_cast<char *>(userIDList.c_str());
|
||||
|
||||
check_friend(NewBaseCallBack(result), operationID_cs, userIDList_cs);
|
||||
}
|
||||
else
|
||||
{
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void FriendshipManagerService::deleteFriend(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
{
|
||||
if (arguments)
|
||||
{
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto userID = zego_value_get_string(arguments->at(flutter::EncodableValue("userID")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
char *userID_cs = const_cast<char *>(userID.c_str());
|
||||
|
||||
delete_friend(NewBaseCallBack(result), operationID_cs, userID_cs);
|
||||
}
|
||||
else
|
||||
{
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void FriendshipManagerService::acceptFriendApplication(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
{
|
||||
if (arguments)
|
||||
{
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto applicationInfo = map_2_json(*arguments);
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
char *applicationInfo_cs = const_cast<char *>(applicationInfo.c_str());
|
||||
|
||||
accept_friend_application(NewBaseCallBack(result), operationID_cs, applicationInfo_cs);
|
||||
}
|
||||
else
|
||||
{
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void FriendshipManagerService::refuseFriendApplication(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
{
|
||||
if (arguments)
|
||||
{
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto applicationInfo = map_2_json(*arguments);
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
char *applicationInfo_cs = const_cast<char *>(applicationInfo.c_str());
|
||||
|
||||
refuse_friend_application(NewBaseCallBack(result), operationID_cs, applicationInfo_cs);
|
||||
}
|
||||
else
|
||||
{
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void FriendshipManagerService::searchFriends(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
{
|
||||
if (arguments)
|
||||
{
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto searchParam = value_2_json(arguments->at(flutter::EncodableValue("searchParam")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
char *searchParam_cs = const_cast<char *>(searchParam.c_str());
|
||||
|
||||
search_friends(NewBaseCallBack(result), operationID_cs, searchParam_cs);
|
||||
}
|
||||
else
|
||||
{
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void FriendshipManagerService::updateFriends(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
{
|
||||
if (arguments)
|
||||
{
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto req = value_2_json(arguments->at(flutter::EncodableValue("req")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
char *req_cs = const_cast<char *>(req.c_str());
|
||||
|
||||
update_friends(NewBaseCallBack(result), operationID_cs, req_cs);
|
||||
}
|
||||
else
|
||||
{
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
72
windows/src/common/services/FriendManager.h
Normal file
72
windows/src/common/services/FriendManager.h
Normal file
@ -0,0 +1,72 @@
|
||||
#ifndef FRIENDSHIP_MANAGER_SERVICE_H
|
||||
#define FRIENDSHIP_MANAGER_SERVICE_H
|
||||
|
||||
#include "../FLTService.h"
|
||||
#include "Listen.h"
|
||||
#include <flutter/standard_method_codec.h>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
class FriendshipManagerService : public FLTService
|
||||
{
|
||||
public:
|
||||
FriendshipManagerService();
|
||||
|
||||
virtual void onMethodCalled(
|
||||
const std::string& method, const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
override;
|
||||
|
||||
// Method handlers
|
||||
void setFriendListener(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getFriendsInfo(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void addFriend(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getFriendApplicationListAsRecipient(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getFriendApplicationListAsApplicant(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getFriendList(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getFriendListPage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void addBlacklist(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getBlacklist(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void removeBlacklist(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void checkFriend(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void deleteFriend(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void acceptFriendApplication(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void refuseFriendApplication(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void searchFriends(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void updateFriends(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
};
|
||||
|
||||
#endif // FRIENDSHIP_MANAGER_SERVICE_H
|
508
windows/src/common/services/GroupManager.cpp
Normal file
508
windows/src/common/services/GroupManager.cpp
Normal file
@ -0,0 +1,508 @@
|
||||
#include "GroupManager.h"
|
||||
#include <libopenimsdk.h>
|
||||
#include "../NimResult.h"
|
||||
#include "../ZegoDataUtils.h"
|
||||
#include "ConstDefine.h"
|
||||
#include "Listen.h"
|
||||
|
||||
GroupManagerService::GroupManagerService() {
|
||||
m_serviceName = "groupManager";
|
||||
}
|
||||
|
||||
void GroupManagerService::onMethodCalled(
|
||||
const std::string& method,
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (method == "setGroupListener") {
|
||||
setGroupListener(arguments, result);
|
||||
} else if (method == "inviteUserToGroup") {
|
||||
inviteUserToGroup(arguments, result);
|
||||
} else if (method == "kickGroupMember") {
|
||||
kickGroupMember(arguments, result);
|
||||
} else if (method == "getGroupMembersInfo") {
|
||||
getGroupMembersInfo(arguments, result);
|
||||
} else if (method == "getGroupMemberList") {
|
||||
getGroupMemberList(arguments, result);
|
||||
} else if (method == "getJoinedGroupList") {
|
||||
getJoinedGroupList(arguments, result);
|
||||
} else if (method == "getJoinedGroupListPage") {
|
||||
getJoinedGroupListPage(arguments, result);
|
||||
} else if (method == "createGroup") {
|
||||
createGroup(arguments, result);
|
||||
} else if (method == "setGroupInfo") {
|
||||
setGroupInfo(arguments, result);
|
||||
} else if (method == "getGroupsInfo") {
|
||||
getGroupsInfo(arguments, result);
|
||||
} else if (method == "joinGroup") {
|
||||
joinGroup(arguments, result);
|
||||
} else if (method == "quitGroup") {
|
||||
quitGroup(arguments, result);
|
||||
} else if (method == "transferGroupOwner") {
|
||||
transferGroupOwner(arguments, result);
|
||||
} else if (method == "getGroupApplicationListAsRecipient") {
|
||||
getGroupApplicationListAsRecipient(arguments, result);
|
||||
} else if (method == "getGroupApplicationListAsApplicant") {
|
||||
getGroupApplicationListAsApplicant(arguments, result);
|
||||
} else if (method == "acceptGroupApplication") {
|
||||
acceptGroupApplication(arguments, result);
|
||||
} else if (method == "refuseGroupApplication") {
|
||||
refuseGroupApplication(arguments, result);
|
||||
} else if (method == "dismissGroup") {
|
||||
dismissGroup(arguments, result);
|
||||
} else if (method == "changeGroupMute") {
|
||||
changeGroupMute(arguments, result);
|
||||
} else if (method == "changeGroupMemberMute") {
|
||||
changeGroupMemberMute(arguments, result);
|
||||
} else if (method == "searchGroups") {
|
||||
searchGroups(arguments, result);
|
||||
} else if (method == "getGroupMemberListByJoinTimeFilter") {
|
||||
getGroupMemberListByJoinTimeFilter(arguments, result);
|
||||
} else if (method == "getGroupMemberOwnerAndAdmin") {
|
||||
getGroupMemberOwnerAndAdmin(arguments, result);
|
||||
} else if (method == "searchGroupMembers") {
|
||||
searchGroupMembers(arguments, result);
|
||||
} else if (method == "setGroupMemberInfo") {
|
||||
setGroupMemberInfo(arguments, result);
|
||||
} else if (method == "isJoinGroup") {
|
||||
isJoinGroup(arguments, result);
|
||||
} else if (method == "getUsersInGroup") {
|
||||
getUsersInGroup(arguments, result);
|
||||
} else {
|
||||
result->NotImplemented();
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::setGroupListener(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
set_group_listener(NewGroupListenerCallBack());
|
||||
result->Success(flutter::EncodableValue());
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::inviteUserToGroup(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto groupID = zego_value_get_string(arguments->at(flutter::EncodableValue("groupID")));
|
||||
auto reason = zego_value_get_string(arguments->at(flutter::EncodableValue("reason")));
|
||||
auto userIDList = value_2_json(arguments->at(flutter::EncodableValue("userIDList")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* groupID_cs = const_cast<char*>(groupID.c_str());
|
||||
char* reason_cs = const_cast<char*>(reason.c_str());
|
||||
char* userIDList_cs = const_cast<char*>(userIDList.c_str());
|
||||
|
||||
invite_user_to_group(NewBaseCallBack(result), operationID_cs, groupID_cs, reason_cs, userIDList_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::kickGroupMember(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto groupID = zego_value_get_string(arguments->at(flutter::EncodableValue("groupID")));
|
||||
auto reason = zego_value_get_string(arguments->at(flutter::EncodableValue("reason")));
|
||||
auto userIDList = value_2_json(arguments->at(flutter::EncodableValue("userIDList")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* groupID_cs = const_cast<char*>(groupID.c_str());
|
||||
char* reason_cs = const_cast<char*>(reason.c_str());
|
||||
char* userIDList_cs = const_cast<char*>(userIDList.c_str());
|
||||
|
||||
kick_group_member(NewBaseCallBack(result), operationID_cs, groupID_cs, reason_cs, userIDList_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::getGroupMembersInfo(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto groupID = zego_value_get_string(arguments->at(flutter::EncodableValue("groupID")));
|
||||
auto userIDList = value_2_json(arguments->at(flutter::EncodableValue("userIDList")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* groupID_cs = const_cast<char*>(groupID.c_str());
|
||||
char* userIDList_cs = const_cast<char*>(userIDList.c_str());
|
||||
|
||||
get_specified_group_members_info(NewBaseCallBack(result), operationID_cs, groupID_cs, userIDList_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::getGroupMemberList(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto groupID = zego_value_get_string(arguments->at(flutter::EncodableValue("groupID")));
|
||||
auto filter = zego_value_get_int(arguments->at(flutter::EncodableValue("filter")));
|
||||
auto offset = zego_value_get_int(arguments->at(flutter::EncodableValue("offset")));
|
||||
auto count = zego_value_get_int(arguments->at(flutter::EncodableValue("count")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* groupID_cs = const_cast<char*>(groupID.c_str());
|
||||
|
||||
get_group_member_list(NewBaseCallBack(result), operationID_cs, groupID_cs, filter, offset, count);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::getJoinedGroupList(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
|
||||
get_joined_group_list(NewBaseCallBack(result), operationID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::getJoinedGroupListPage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto offset = zego_value_get_int(arguments->at(flutter::EncodableValue("offset")));
|
||||
auto count = zego_value_get_int(arguments->at(flutter::EncodableValue("count")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
|
||||
get_joined_group_list_page(NewBaseCallBack(result), operationID_cs, offset, count);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::createGroup(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto groupInfo = map_2_json(*arguments);
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* groupInfo_cs = const_cast<char*>(groupInfo.c_str());
|
||||
|
||||
create_group(NewBaseCallBack(result), operationID_cs, groupInfo_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::setGroupInfo(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto groupInfo = value_2_json(arguments->at(flutter::EncodableValue("groupInfo")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* groupInfo_cs = const_cast<char*>(groupInfo.c_str());
|
||||
|
||||
set_group_info(NewBaseCallBack(result), operationID_cs, groupInfo_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::getGroupsInfo(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto groupIDList = value_2_json(arguments->at(flutter::EncodableValue("groupIDList")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* groupIDList_cs = const_cast<char*>(groupIDList.c_str());
|
||||
|
||||
get_specified_groups_info(NewBaseCallBack(result), operationID_cs, groupIDList_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::joinGroup(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto groupID = zego_value_get_string(arguments->at(flutter::EncodableValue("groupID")));
|
||||
auto reason = zego_value_get_string(arguments->at(flutter::EncodableValue("reason")));
|
||||
auto joinSource = zego_value_get_int(arguments->at(flutter::EncodableValue("joinSource")));
|
||||
auto ex = zego_value_get_string(arguments->at(flutter::EncodableValue("ex")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* groupID_cs = const_cast<char*>(groupID.c_str());
|
||||
char* reason_cs = const_cast<char*>(reason.c_str());
|
||||
char* ex_cs = const_cast<char*>(ex.c_str());
|
||||
|
||||
join_group(NewBaseCallBack(result), operationID_cs, groupID_cs, reason_cs, joinSource, ex_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::quitGroup(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto groupID = zego_value_get_string(arguments->at(flutter::EncodableValue("groupID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* groupID_cs = const_cast<char*>(groupID.c_str());
|
||||
|
||||
quit_group(NewBaseCallBack(result), operationID_cs, groupID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::transferGroupOwner(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto groupID = zego_value_get_string(arguments->at(flutter::EncodableValue("groupID")));
|
||||
auto userID = zego_value_get_string(arguments->at(flutter::EncodableValue("userID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* groupID_cs = const_cast<char*>(groupID.c_str());
|
||||
char* userID_cs = const_cast<char*>(userID.c_str());
|
||||
|
||||
transfer_group_owner(NewBaseCallBack(result), operationID_cs, groupID_cs, userID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::getGroupApplicationListAsRecipient(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
|
||||
get_group_application_list_as_recipient(NewBaseCallBack(result), operationID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::getGroupApplicationListAsApplicant(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
|
||||
get_group_application_list_as_applicant(NewBaseCallBack(result), operationID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::acceptGroupApplication(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto groupID = zego_value_get_string(arguments->at(flutter::EncodableValue("groupID")));
|
||||
auto userID = zego_value_get_string(arguments->at(flutter::EncodableValue("userID")));
|
||||
auto handleMsg = zego_value_get_string(arguments->at(flutter::EncodableValue("handleMsg")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* groupID_cs = const_cast<char*>(groupID.c_str());
|
||||
char* userID_cs = const_cast<char*>(userID.c_str());
|
||||
char* handleMsg_cs = const_cast<char*>(handleMsg.c_str());
|
||||
|
||||
accept_group_application(NewBaseCallBack(result), operationID_cs, groupID_cs, userID_cs, handleMsg_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::refuseGroupApplication(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto groupID = zego_value_get_string(arguments->at(flutter::EncodableValue("groupID")));
|
||||
auto userID = zego_value_get_string(arguments->at(flutter::EncodableValue("userID")));
|
||||
auto handleMsg = zego_value_get_string(arguments->at(flutter::EncodableValue("handleMsg")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* groupID_cs = const_cast<char*>(groupID.c_str());
|
||||
char* userID_cs = const_cast<char*>(userID.c_str());
|
||||
char* handleMsg_cs = const_cast<char*>(handleMsg.c_str());
|
||||
|
||||
refuse_group_application(NewBaseCallBack(result), operationID_cs, groupID_cs, userID_cs, handleMsg_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::dismissGroup(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto groupID = zego_value_get_string(arguments->at(flutter::EncodableValue("groupID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* groupID_cs = const_cast<char*>(groupID.c_str());
|
||||
|
||||
dismiss_group(NewBaseCallBack(result), operationID_cs, groupID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::changeGroupMute(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto groupID = zego_value_get_string(arguments->at(flutter::EncodableValue("groupID")));
|
||||
auto mute = zego_value_get_bool(arguments->at(flutter::EncodableValue("mute")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* groupID_cs = const_cast<char*>(groupID.c_str());
|
||||
|
||||
change_group_mute(NewBaseCallBack(result), operationID_cs, groupID_cs, mute);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::changeGroupMemberMute(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto groupID = zego_value_get_string(arguments->at(flutter::EncodableValue("groupID")));
|
||||
auto userID = zego_value_get_string(arguments->at(flutter::EncodableValue("userID")));
|
||||
auto seconds = zego_value_get_int(arguments->at(flutter::EncodableValue("seconds")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* groupID_cs = const_cast<char*>(groupID.c_str());
|
||||
char* userID_cs = const_cast<char*>(userID.c_str());
|
||||
|
||||
change_group_member_mute(NewBaseCallBack(result), operationID_cs, groupID_cs, userID_cs, seconds);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::searchGroups(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto searchParam = value_2_json(arguments->at(flutter::EncodableValue("searchParam")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* searchParam_cs = const_cast<char*>(searchParam.c_str());
|
||||
|
||||
search_groups(NewBaseCallBack(result), operationID_cs, searchParam_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::getGroupMemberListByJoinTimeFilter(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto groupID = zego_value_get_string(arguments->at(flutter::EncodableValue("groupID")));
|
||||
auto offset = zego_value_get_int(arguments->at(flutter::EncodableValue("offset")));
|
||||
auto count = zego_value_get_int(arguments->at(flutter::EncodableValue("count")));
|
||||
auto joinTimeBegin = zego_value_get_int(arguments->at(flutter::EncodableValue("joinTimeBegin")));
|
||||
auto joinTimeEnd = zego_value_get_int(arguments->at(flutter::EncodableValue("joinTimeEnd")));
|
||||
auto excludeUserIDList = value_2_json(arguments->at(flutter::EncodableValue("excludeUserIDList")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* groupID_cs = const_cast<char*>(groupID.c_str());
|
||||
char* excludeUserIDList_cs = const_cast<char*>(excludeUserIDList.c_str());
|
||||
|
||||
get_group_member_list_by_join_time_filter(NewBaseCallBack(result), operationID_cs, groupID_cs, offset, count, joinTimeBegin, joinTimeEnd, excludeUserIDList_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::getGroupMemberOwnerAndAdmin(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto groupID = zego_value_get_string(arguments->at(flutter::EncodableValue("groupID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* groupID_cs = const_cast<char*>(groupID.c_str());
|
||||
|
||||
get_group_member_owner_and_admin(NewBaseCallBack(result), operationID_cs, groupID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::searchGroupMembers(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto searchParam = value_2_json(arguments->at(flutter::EncodableValue("searchParam")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* searchParam_cs = const_cast<char*>(searchParam.c_str());
|
||||
|
||||
search_group_members(NewBaseCallBack(result), operationID_cs, searchParam_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::setGroupMemberInfo(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto info = value_2_json(arguments->at(flutter::EncodableValue("info")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* info_cs = const_cast<char*>(info.c_str());
|
||||
|
||||
set_group_member_info(NewBaseCallBack(result), operationID_cs, info_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::isJoinGroup(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto groupID = zego_value_get_string(arguments->at(flutter::EncodableValue("groupID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* groupID_cs = const_cast<char*>(groupID.c_str());
|
||||
|
||||
is_join_group(NewBaseCallBack(result), operationID_cs, groupID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void GroupManagerService::getUsersInGroup(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto groupID = zego_value_get_string(arguments->at(flutter::EncodableValue("groupID")));
|
||||
auto userIDs = value_2_json(arguments->at(flutter::EncodableValue("userIDs")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* groupID_cs = const_cast<char*>(groupID.c_str());
|
||||
char* userIDs_cs = const_cast<char*>(userIDs.c_str());
|
||||
|
||||
get_users_in_group(NewBaseCallBack(result), operationID_cs, groupID_cs, userIDs_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
106
windows/src/common/services/GroupManager.h
Normal file
106
windows/src/common/services/GroupManager.h
Normal file
@ -0,0 +1,106 @@
|
||||
#ifndef GROUP_MANAGER_SERVICE_H
|
||||
#define GROUP_MANAGER_SERVICE_H
|
||||
|
||||
#include "../FLTService.h"
|
||||
#include "Listen.h"
|
||||
#include <flutter/standard_method_codec.h>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
class GroupManagerService : public FLTService
|
||||
{
|
||||
public:
|
||||
GroupManagerService();
|
||||
|
||||
virtual void onMethodCalled(
|
||||
const std::string& method, const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
override;
|
||||
|
||||
// Method handlers
|
||||
void setGroupListener(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void inviteUserToGroup(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void kickGroupMember(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getGroupMembersInfo(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getGroupMemberList(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getJoinedGroupList(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getJoinedGroupListPage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createGroup(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void setGroupInfo(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getGroupsInfo(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void joinGroup(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void quitGroup(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void transferGroupOwner(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getGroupApplicationListAsRecipient(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getGroupApplicationListAsApplicant(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void acceptGroupApplication(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void refuseGroupApplication(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void dismissGroup(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void changeGroupMute(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void changeGroupMemberMute(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void searchGroups(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getGroupMemberListByJoinTimeFilter(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getGroupMemberOwnerAndAdmin(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void searchGroupMembers(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void setGroupMemberInfo(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void isJoinGroup(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getUsersInGroup(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif // GROUP_MANAGER_SERVICE_H
|
255
windows/src/common/services/IMManager.cpp
Normal file
255
windows/src/common/services/IMManager.cpp
Normal file
@ -0,0 +1,255 @@
|
||||
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
|
||||
// Use of this source code is governed by a MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "IMManager.h"
|
||||
|
||||
#if defined(_WIN32)
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#include "../NimResult.h"
|
||||
#include <libopenimsdk.h>
|
||||
#include "../ZegoDataUtils.h"
|
||||
#include "ConstDefine.h"
|
||||
#include "Listen.h"
|
||||
|
||||
|
||||
IMManagerService::IMManagerService() {
|
||||
m_serviceName = "imManager";
|
||||
}
|
||||
|
||||
|
||||
void IMManagerService::onMethodCalled(
|
||||
const std::string &method, const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (method == "initSDK") {
|
||||
initializeSDK(arguments, result);
|
||||
} else if (method == "unInitSDK") {
|
||||
unInitSDK(arguments, result);
|
||||
} else if (method == "login") {
|
||||
login(arguments, result);
|
||||
} else if (method == "logout") {
|
||||
logout(arguments, result);
|
||||
} else if (method == "getLoginStatus") {
|
||||
getLoginStatus(arguments, result);
|
||||
} else if (method == "uploadFile") {
|
||||
uploadFile(arguments, result);
|
||||
} else if (method == "uploadLogs") {
|
||||
uploadLogs(arguments, result);
|
||||
} else if (method == "logs") {
|
||||
logs(arguments, result);
|
||||
} else if (method == "updateFcmToken") {
|
||||
updateFcmToken(arguments, result);
|
||||
} else if (method == "setAppBackgroundStatus") {
|
||||
setAppBackgroundStatus(arguments, result);
|
||||
} else if (method == "networkStatusChanged") {
|
||||
networkStatusChanged(arguments, result);
|
||||
|
||||
} else {
|
||||
result->NotImplemented();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void IMManagerService::initializeSDK(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(ZFValue("operationID")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
auto config = map_2_json(*arguments);
|
||||
char *config_cs = const_cast<char *>(config.c_str());
|
||||
|
||||
|
||||
auto error = init_sdk(NewInitListenCallBack(),
|
||||
operationID_cs,
|
||||
config_cs);
|
||||
if (error == 0) {
|
||||
// handle error
|
||||
std::string msg = "IM init failed";
|
||||
result->Error("", "",
|
||||
NimResult::getErrorResult(error, ""));
|
||||
} else {
|
||||
|
||||
result->Success(EncodableValue(error == 0));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void IMManagerService::unInitSDK(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(
|
||||
arguments->at(flutter::EncodableValue("operationID")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
|
||||
un_init_sdk(operationID_cs);
|
||||
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void IMManagerService::login(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(
|
||||
arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto userID = zego_value_get_string(arguments->at(flutter::EncodableValue("userID")));
|
||||
auto token = zego_value_get_string(arguments->at(flutter::EncodableValue("token")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
char *userID_cs = const_cast<char *>(userID.c_str());
|
||||
char *token_cs = const_cast<char *>(token.c_str());
|
||||
|
||||
::login(NewBaseCallBack(result), operationID_cs, userID_cs, token_cs);
|
||||
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void IMManagerService::logout(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(
|
||||
arguments->at(flutter::EncodableValue("operationID")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
|
||||
::logout(NewBaseCallBack(result), operationID_cs);
|
||||
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void IMManagerService::getLoginStatus(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(
|
||||
arguments->at(flutter::EncodableValue("operationID")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
|
||||
int status = get_login_status(operationID_cs);
|
||||
flutter::EncodableMap statusMap;
|
||||
|
||||
result->Success(flutter::EncodableValue(status));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void IMManagerService::uploadFile(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto id = zego_value_get_string(arguments->at(flutter::EncodableValue("id")));
|
||||
auto fileInfo = map_2_json(*arguments);
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* fileInfo_cs = const_cast<char*>(fileInfo.c_str());
|
||||
|
||||
upload_file(NewBaseCallBack(result), operationID_cs, fileInfo_cs, NewUploadFileListenCallBack(id));
|
||||
}
|
||||
else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void IMManagerService::uploadLogs(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(
|
||||
arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto line = zego_value_get_int(arguments->at(flutter::EncodableValue("line")));
|
||||
auto ex = zego_value_get_string(arguments->at(flutter::EncodableValue("ex")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
char *ex_cs = const_cast<char *>(ex.c_str());
|
||||
|
||||
::upload_logs(NewBaseCallBack(result), operationID_cs, line, ex_cs, NewUploadLogsListenCallBack());
|
||||
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void IMManagerService::logs(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto logLevel = zego_value_get_int(arguments->at(flutter::EncodableValue("logLevel")));
|
||||
auto file = zego_value_get_string(arguments->at(flutter::EncodableValue("file")));
|
||||
auto line = zego_value_get_int(arguments->at(flutter::EncodableValue("line")));
|
||||
auto msgs = zego_value_get_string(arguments->at(flutter::EncodableValue("msgs")));
|
||||
auto err = zego_value_get_string(arguments->at(flutter::EncodableValue("err")));
|
||||
auto keyAndValue = zego_value_get_string(arguments->at(flutter::EncodableValue("keyAndValue")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* file_cs = const_cast<char*>(file.c_str());
|
||||
char* msgs_cs = const_cast<char*>(msgs.c_str());
|
||||
char* err_cs = const_cast<char*>(err.c_str());
|
||||
char* keyAndValue_cs = const_cast<char*>(keyAndValue.c_str());
|
||||
|
||||
::logs(NewBaseCallBack(result), operationID_cs, logLevel, file_cs, line, msgs_cs, err_cs, keyAndValue_cs);
|
||||
|
||||
}
|
||||
else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void IMManagerService::updateFcmToken(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(
|
||||
arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto fcmToken = zego_value_get_string(arguments->at(flutter::EncodableValue("fcmToken")));
|
||||
auto expireTime = zego_value_get_int(arguments->at(flutter::EncodableValue("expireTime")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
char *fcmToken_cs = const_cast<char *>(fcmToken.c_str());
|
||||
|
||||
::update_fcm_token(NewBaseCallBack(result), operationID_cs, fcmToken_cs,
|
||||
expireTime);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void IMManagerService::setAppBackgroundStatus(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(
|
||||
arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto isBackground = zego_value_get_bool(
|
||||
arguments->at(flutter::EncodableValue("isBackground")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
|
||||
set_app_background_status(NewBaseCallBack(result), operationID_cs, isBackground);
|
||||
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void IMManagerService::networkStatusChanged(
|
||||
const flutter::EncodableMap *arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(
|
||||
arguments->at(flutter::EncodableValue("operationID")));
|
||||
char *operationID_cs = const_cast<char *>(operationID.c_str());
|
||||
network_status_changed(NewBaseCallBack(result), operationID_cs);
|
||||
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
70
windows/src/common/services/IMManager.h
Normal file
70
windows/src/common/services/IMManager.h
Normal file
@ -0,0 +1,70 @@
|
||||
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
|
||||
// Use of this source code is governed by a MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef IMMANAGER_H
|
||||
#define IMMANAGER_H
|
||||
|
||||
#include "../FLTService.h"
|
||||
#include "Listen.h"
|
||||
|
||||
|
||||
|
||||
class IMManagerService : public FLTService {
|
||||
public:
|
||||
IMManagerService();
|
||||
virtual void onMethodCalled(
|
||||
const std::string& method, const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
override;
|
||||
|
||||
private:
|
||||
void initializeSDK(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
void unInitSDK(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
void login(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
void logout(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
void getLoginStatus(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
void uploadFile(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
void uploadLogs(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
void logs(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
void updateFcmToken(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
void setAppBackgroundStatus(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
void networkStatusChanged(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif // IMMANAGER_H
|
621
windows/src/common/services/Listen.cpp
Normal file
621
windows/src/common/services/Listen.cpp
Normal file
@ -0,0 +1,621 @@
|
||||
#include "Listen.h"
|
||||
|
||||
#include "wrapp_cpp_function.inc"
|
||||
#include "ConstDefine.h"
|
||||
#include "../FLTService.h"
|
||||
#include "../ThreadUtil.h"
|
||||
#include "../json.hpp"
|
||||
using json = nlohmann::json;
|
||||
|
||||
CB_S_I_S_S NewBaseCallBack(std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
{
|
||||
|
||||
auto t = std::make_shared<BaseCallBack>(result);
|
||||
auto f = [t](const std::string &operationID, int errCode, const std::string &errMsg, const std::string &data)
|
||||
{
|
||||
t->HandleCallback(operationID, errCode, errMsg, data);
|
||||
};
|
||||
|
||||
return _wrapper_callonce_cpp_function(f);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void InitListenCallBack::HandleCallback(int state, const std::string &msg)
|
||||
{
|
||||
flutter::EncodableMap arguments;
|
||||
switch (ConstDefine(state))
|
||||
{
|
||||
case ConstDefine::CONNECTING:
|
||||
arguments.insert(std::make_pair("type", "onConnecting"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::CONNECT_SUCCESS:
|
||||
arguments.insert(std::make_pair("type", "onConnectSuccess"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::CONNECT_FAILED:
|
||||
arguments.insert(std::make_pair("type", "onConnectFailed"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::KICKED_OFFLINE:
|
||||
arguments.insert(std::make_pair("type", "onKickedOffline"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::USER_TOKEN_EXPIRED:
|
||||
arguments.insert(std::make_pair("type", "onUserTokenExpired"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::USER_TOKEN_INVALID:
|
||||
arguments.insert(std::make_pair("type", "onUserTokenExpired"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
}
|
||||
notifyEvent("connectListener", arguments);
|
||||
}
|
||||
|
||||
CB_I_S NewInitListenCallBack()
|
||||
{
|
||||
auto t = std::make_shared<InitListenCallBack>();
|
||||
auto f = [t](int state, const std::string &msg)
|
||||
{
|
||||
t->HandleCallback(state, msg);
|
||||
};
|
||||
|
||||
return _wrapper_cpp_function(f);
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void UploadFileListenCallBack::HandleCallback(int state, const std::string &msg)
|
||||
{
|
||||
flutter::EncodableMap arguments;
|
||||
flutter::EncodableMap data;
|
||||
json j;
|
||||
switch (ConstDefine(state))
|
||||
{
|
||||
case ConstDefine::OPEN:
|
||||
data.insert(std::make_pair("id", id));
|
||||
data.insert(std::make_pair("size", std::stoi(msg)));
|
||||
arguments.insert(std::make_pair("type", "open"));
|
||||
arguments.insert(std::make_pair("data", data));
|
||||
break;
|
||||
case ConstDefine::PART_SIZE:
|
||||
// 需要使用json反序列化对象msg,使用临时结构
|
||||
j = json::parse(msg);
|
||||
data.insert(std::make_pair("id", id));
|
||||
data.insert(std::make_pair("partSize", j.at("partSize").get<int>()));
|
||||
data.insert(std::make_pair("num", j.at("num").get<int>()));
|
||||
arguments.insert(std::make_pair("type", "partSize"));
|
||||
arguments.insert(std::make_pair("data", data));
|
||||
break;
|
||||
case ConstDefine::HASH_PART_PROGRESS:
|
||||
j = json::parse(msg);
|
||||
data.insert(std::make_pair("id", id));
|
||||
data.insert(std::make_pair("index", j.at("index").get<int>()));
|
||||
data.insert(std::make_pair("size", j.at("size").get<int>()));
|
||||
data.insert(std::make_pair("partHash", j.at("partHash").get<std::string>()));
|
||||
arguments.insert(std::make_pair("type", "hashPartProgress"));
|
||||
arguments.insert(std::make_pair("data", data));
|
||||
break;
|
||||
case ConstDefine::HASH_PART_COMPLETE:
|
||||
j = json::parse(msg);
|
||||
data.insert(std::make_pair("id", id));
|
||||
data.insert(std::make_pair("partHash", j.at("partHash").get<std::string>()));
|
||||
data.insert(std::make_pair("fileHash", j.at("fileHash").get<std::string>()));
|
||||
arguments.insert(std::make_pair("type", "hashPartComplete"));
|
||||
arguments.insert(std::make_pair("data", data));
|
||||
break;
|
||||
case ConstDefine::UPLOAD_ID:
|
||||
data.insert(std::make_pair("id", id));
|
||||
data.insert(std::make_pair("uploadID", msg));
|
||||
arguments.insert(std::make_pair("type", "uploadID"));
|
||||
arguments.insert(std::make_pair("data", data));
|
||||
break;
|
||||
case ConstDefine::UPLOAD_PART_COMPLETE:
|
||||
j = json::parse(msg);
|
||||
data.insert(std::make_pair("id", id));
|
||||
data.insert(std::make_pair("index", j.at("index").get<int>()));
|
||||
data.insert(std::make_pair("partSize", j.at("partSize").get<int>()));
|
||||
data.insert(std::make_pair("partHash", j.at("partHash").get<std::string>()));
|
||||
arguments.insert(std::make_pair("type", "uploadPartComplete"));
|
||||
arguments.insert(std::make_pair("data", data));
|
||||
break;
|
||||
case ConstDefine::UPLOAD_COMPLETE:
|
||||
j = json::parse(msg);
|
||||
data.insert(std::make_pair("id", id));
|
||||
data.insert(std::make_pair("fileSize", j.at("fileSize").get<int>()));
|
||||
data.insert(std::make_pair("streamSize", j.at("streamSize").get<int>()));
|
||||
data.insert(std::make_pair("storageSize", j.at("storageSize").get<int>()));
|
||||
arguments.insert(std::make_pair("type", "uploadProgress"));
|
||||
arguments.insert(std::make_pair("data", data));
|
||||
break;
|
||||
case ConstDefine::COMPLETE:
|
||||
j = json::parse(msg);
|
||||
data.insert(std::make_pair("id", id));
|
||||
data.insert(std::make_pair("size", j.at("fileSize").get<int>()));
|
||||
data.insert(std::make_pair("url", j.at("url").get<std::string>()));
|
||||
data.insert(std::make_pair("type", j.at("fileSize").get<int>()));
|
||||
arguments.insert(std::make_pair("type", "complete"));
|
||||
arguments.insert(std::make_pair("data", data));
|
||||
break;
|
||||
}
|
||||
notifyEvent("uploadFileListener", arguments);
|
||||
}
|
||||
|
||||
CB_I_S NewUploadFileListenCallBack(std::string id)
|
||||
{
|
||||
auto t = std::make_shared<UploadFileListenCallBack>(id);
|
||||
auto f = [t](int state, const std::string &msg)
|
||||
{
|
||||
t->HandleCallback(state, msg);
|
||||
};
|
||||
|
||||
return _wrapper_cpp_function(f);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void UploadLogsListenCallBack::HandleCallback(int state, const std::string &msg)
|
||||
{
|
||||
flutter::EncodableMap arguments;
|
||||
flutter::EncodableMap data;
|
||||
json j;
|
||||
switch (ConstDefine(state))
|
||||
{
|
||||
case ConstDefine::ON_PROGRESS:
|
||||
j = json::parse(msg);
|
||||
data.insert(std::make_pair("current", j.at("current").get<int>()));
|
||||
data.insert(std::make_pair("size", j.at("size").get<int>()));
|
||||
arguments.insert(std::make_pair("type", "onProgress"));
|
||||
arguments.insert(std::make_pair("data", data));
|
||||
break;
|
||||
}
|
||||
notifyEvent("uploadLogsListener", arguments);
|
||||
}
|
||||
|
||||
CB_I_S NewUploadLogsListenCallBack()
|
||||
{
|
||||
auto t = std::make_shared<UploadLogsListenCallBack>();
|
||||
auto f = [t](int state, const std::string &msg)
|
||||
{
|
||||
t->HandleCallback(state, msg);
|
||||
};
|
||||
|
||||
return _wrapper_cpp_function(f);
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void UserListenCallBack::HandleCallback(int state, const std::string &msg)
|
||||
{
|
||||
flutter::EncodableMap arguments;
|
||||
flutter::EncodableMap data;
|
||||
json j;
|
||||
switch (ConstDefine(state))
|
||||
{
|
||||
case ConstDefine::SELF_INFO_UPDATED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onSelfInfoUpdated"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::USER_STATUS_CHANGED:
|
||||
arguments.insert(std::make_pair("type", "onUserStatusChanged"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
}
|
||||
notifyEvent("userListener", arguments);
|
||||
}
|
||||
|
||||
CB_I_S NewUserListenCallBack()
|
||||
{
|
||||
auto t = std::make_shared<UserListenCallBack>();
|
||||
auto f = [t](int state, const std::string &msg)
|
||||
{
|
||||
t->HandleCallback(state, msg);
|
||||
};
|
||||
|
||||
return _wrapper_cpp_function(f);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void AdvancedMsgListenCallBack::HandleCallback(int state, const std::string &msg)
|
||||
{
|
||||
flutter::EncodableMap arguments;
|
||||
flutter::EncodableMap data;
|
||||
json j;
|
||||
switch (ConstDefine(state))
|
||||
{
|
||||
case ConstDefine::MSG_DELETED:
|
||||
data.insert(std::make_pair("id", id));
|
||||
data.insert(std::make_pair("message", msg));
|
||||
arguments.insert(std::make_pair("type", "onMsgDeleted"));
|
||||
arguments.insert(std::make_pair("data", data));
|
||||
break;
|
||||
case ConstDefine::NEW_RECV_MESSAGE_REVOKED:
|
||||
data.insert(std::make_pair("id", id));
|
||||
data.insert(std::make_pair("messageRevoked", msg));
|
||||
arguments.insert(std::make_pair("type", "onNewRecvMessageRevoked"));
|
||||
arguments.insert(std::make_pair("data", data));
|
||||
break;
|
||||
case ConstDefine::NEW_RECV_MESSAGE_EDIT:
|
||||
data.insert(std::make_pair("id", id));
|
||||
data.insert(std::make_pair("messageEdited", msg));
|
||||
arguments.insert(std::make_pair("type", "onNewRecvMessageEdited"));
|
||||
arguments.insert(std::make_pair("data", data));
|
||||
break;
|
||||
case ConstDefine::RECV_C2C_READ_RECEIPT:
|
||||
data.insert(std::make_pair("id", id));
|
||||
data.insert(std::make_pair("msgReceiptList", msg));
|
||||
arguments.insert(std::make_pair("type", "onRecvC2CReadReceipt"));
|
||||
arguments.insert(std::make_pair("data", data));
|
||||
break;
|
||||
case ConstDefine::RECV_NEW_MESSAGE:
|
||||
data.insert(std::make_pair("id", id));
|
||||
data.insert(std::make_pair("message", msg));
|
||||
arguments.insert(std::make_pair("type", "onRecvNewMessage"));
|
||||
arguments.insert(std::make_pair("data", data));
|
||||
break;
|
||||
case ConstDefine::RECV_OFFLINE_NEW_MESSAGE:
|
||||
data.insert(std::make_pair("id", id));
|
||||
data.insert(std::make_pair("message", msg));
|
||||
arguments.insert(std::make_pair("type", "onRecvOfflineNewMessage"));
|
||||
arguments.insert(std::make_pair("data", data));
|
||||
break;
|
||||
case ConstDefine::RECV_ONLINE_ONLY_MESSAGE:
|
||||
data.insert(std::make_pair("id", id));
|
||||
data.insert(std::make_pair("message", msg));
|
||||
arguments.insert(std::make_pair("type", "onRecvOnlineOnlyMessage"));
|
||||
arguments.insert(std::make_pair("data", data));
|
||||
break;
|
||||
}
|
||||
notifyEvent("advancedMsgListener", arguments);
|
||||
}
|
||||
|
||||
CB_I_S NewAdvancedMsgListenCallBack(std::string id)
|
||||
{
|
||||
auto t = std::make_shared<AdvancedMsgListenCallBack>(id);
|
||||
auto f = [t](int state, const std::string &msg)
|
||||
{
|
||||
t->HandleCallback(state, msg);
|
||||
};
|
||||
|
||||
return _wrapper_cpp_function(f);
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void MsgSendListenerCallBack::HandleCallback(const std::string &operationID, int state, const std::string &error, const std::string &msg, long progress)
|
||||
{
|
||||
if (result == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (state == 0 && progress == 0 && msg.empty())
|
||||
{
|
||||
flutter::EncodableMap arguments;
|
||||
flutter::EncodableMap data;
|
||||
json j;
|
||||
data.insert(std::make_pair("clientMsgID", clientMsgID));
|
||||
data.insert(std::make_pair("progress", progress));
|
||||
arguments.insert(std::make_pair("type", "onProgress"));
|
||||
arguments.insert(std::make_pair("data", data));
|
||||
notifyEvent("msgSendProgressListener", arguments);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Create shared pointers for the data to ensure copy constructibility
|
||||
auto resultCopy = result;
|
||||
auto dataCopy = std::make_shared<std::string>(msg);
|
||||
auto errCodeCopy = state;
|
||||
auto errMsgCopy = std::make_shared<std::string>(error);
|
||||
|
||||
// Ensure callback runs on the platform thread
|
||||
ThreadUtil::RunOnPlatformThread([resultCopy, errCodeCopy, errMsgCopy, dataCopy]()
|
||||
{
|
||||
if (errCodeCopy == 0) {
|
||||
resultCopy->Success(flutter::EncodableValue(*dataCopy));
|
||||
} else {
|
||||
resultCopy->Error(std::to_string(errCodeCopy), *errMsgCopy,
|
||||
flutter::EncodableValue(*dataCopy));
|
||||
} });
|
||||
}
|
||||
}
|
||||
|
||||
CB_S_I_S_S_I NewMsgSendCallBack(std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result, std::string clientMsgID)
|
||||
{
|
||||
auto t = std::make_shared<MsgSendListenerCallBack>(result, clientMsgID);
|
||||
auto f = [t](const std::string &operationID, int state, const std::string &error, const std::string &msg, long progress)
|
||||
{
|
||||
t->HandleCallback(operationID, state, error, msg, progress);
|
||||
};
|
||||
|
||||
return _wrapper_callonce_cpp_function(f);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void CustomBusinessListenCallBack::HandleCallback(int state, const std::string &msg)
|
||||
{
|
||||
flutter::EncodableMap arguments;
|
||||
flutter::EncodableMap data;
|
||||
json j;
|
||||
switch (ConstDefine(state))
|
||||
{
|
||||
case ConstDefine::RECV_CUSTOM_BUSINESS_MESSAGE:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onRecvCustomBusinessMessage"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
}
|
||||
notifyEvent("customBusinessListener", arguments);
|
||||
}
|
||||
|
||||
CB_I_S NewCustomBusinessListenCallBack()
|
||||
{
|
||||
auto t = std::make_shared<CustomBusinessListenCallBack>();
|
||||
auto f = [t](int state, const std::string &msg)
|
||||
{
|
||||
t->HandleCallback(state, msg);
|
||||
};
|
||||
|
||||
return _wrapper_callonce_cpp_function(f);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void GroupListenerCallBack::HandleCallback(int state, const std::string &msg)
|
||||
{
|
||||
flutter::EncodableMap arguments;
|
||||
flutter::EncodableMap data;
|
||||
|
||||
switch (ConstDefine(state))
|
||||
{
|
||||
case ConstDefine::GROUP_APPLICATION_ACCEPTED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onGroupApplicationAccepted"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::GROUP_APPLICATION_ADDED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onGroupApplicationAdded"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::GROUP_APPLICATION_DELETED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onGroupApplicationDeleted"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::GROUP_APPLICATION_REJECTED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onGroupApplicationRejected"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::GROUP_DISMISSED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onGroupDismissed"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::GROUP_INFO_CHANGED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onGroupInfoChanged"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::GROUP_MEMBER_ADDED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onGroupMemberAdded"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::GROUP_MEMBER_DELETED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onGroupMemberDeleted"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::GROUP_MEMBER_INFO_CHANGED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onGroupMemberInfoChanged"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::JOINED_GROUP_ADDED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onJoinedGroupAdded"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::JOINED_GROUP_DELETED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onJoinedGroupDeleted"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
}
|
||||
notifyEvent("groupListener", arguments);
|
||||
}
|
||||
|
||||
CB_I_S NewGroupListenerCallBack()
|
||||
{
|
||||
auto t = std::make_shared<GroupListenerCallBack>();
|
||||
auto f = [t](int state, const std::string &msg)
|
||||
{
|
||||
t->HandleCallback(state, msg);
|
||||
};
|
||||
|
||||
return _wrapper_cpp_function(f);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void ConversationListenerCallBack::HandleCallback(int state, const std::string &msg)
|
||||
{
|
||||
flutter::EncodableMap arguments;
|
||||
flutter::EncodableMap data;
|
||||
json j;
|
||||
switch (ConstDefine(state))
|
||||
{
|
||||
case ConstDefine::CONVERSATION_CHANGED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onConversationChanged"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::CONVERSATION_USER_INPUT_STATUS_CHANGED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onConversationUserInputStatusChanged"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::NEW_CONVERSATION:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onNewConversation"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::SYNC_SERVER_FAILED:
|
||||
j = json::parse(msg);
|
||||
arguments.insert(std::make_pair("type", "onSyncServerFailed"));
|
||||
arguments.insert(std::make_pair("data", j.at("reinstalled").get<bool>()));
|
||||
break;
|
||||
case ConstDefine::SYNC_SERVER_FINISH:
|
||||
j = json::parse(msg);
|
||||
arguments.insert(std::make_pair("type", "onSyncServerFinish"));
|
||||
arguments.insert(std::make_pair("data", j.at("reinstalled").get<bool>()));
|
||||
break;
|
||||
case ConstDefine::SYNC_SERVER_START:
|
||||
j = json::parse(msg);
|
||||
arguments.insert(std::make_pair("type", "onSyncServerStart"));
|
||||
arguments.insert(std::make_pair("data", j.at("reinstalled").get<bool>()));
|
||||
break;
|
||||
case ConstDefine::SYNC_SERVER_PROGRESS:
|
||||
j = json::parse(msg);
|
||||
arguments.insert(std::make_pair("type", "onSyncServerProgress"));
|
||||
arguments.insert(std::make_pair("data", j.at("progress").get<int>()));
|
||||
break;
|
||||
case ConstDefine::TOTAL_UNREAD_MESSAGE_COUNT_CHANGED:
|
||||
j = json::parse(msg);
|
||||
arguments.insert(std::make_pair("type", "onTotalUnreadMessageCountChanged"));
|
||||
arguments.insert(std::make_pair("data", j.at("count").get<int>()));
|
||||
break;
|
||||
}
|
||||
notifyEvent("conversationListener", arguments);
|
||||
}
|
||||
|
||||
CB_I_S NewConversationListenerCallBack()
|
||||
{
|
||||
auto t = std::make_shared<ConversationListenerCallBack>();
|
||||
auto f = [t](int state, const std::string &msg)
|
||||
{
|
||||
t->HandleCallback(state, msg);
|
||||
};
|
||||
|
||||
return _wrapper_cpp_function(f);
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void FriendshipListenCallBack::HandleCallback(int state, const std::string &msg)
|
||||
{
|
||||
flutter::EncodableMap arguments;
|
||||
flutter::EncodableMap data;
|
||||
|
||||
switch (ConstDefine(state))
|
||||
{
|
||||
case ConstDefine::BLACK_ADDED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onBlackAdded"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::BLACK_DELETED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onBlackDeleted"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::FRIEND_ADDED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onFriendAdded"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::FRIEND_APPLICATION_ACCEPTED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onFriendApplicationAccepted"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::FRIEND_APPLICATION_ADDED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onFriendApplicationAdded"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::FRIEND_APPLICATION_DELETED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onFriendApplicationDeleted"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::FRIEND_APPLICATION_REJECTED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onFriendApplicationRejected"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::FRIEND_DELETED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onFriendDeleted"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::FRIEND_INFO_CHANGED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onFriendInfoChanged"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
}
|
||||
notifyEvent("friendListener", arguments);
|
||||
}
|
||||
|
||||
CB_I_S NewFriendshipListenCallBack()
|
||||
{
|
||||
auto t = std::make_shared<FriendshipListenCallBack>();
|
||||
auto f = [t](int state, const std::string &msg)
|
||||
{
|
||||
t->HandleCallback(state, msg);
|
||||
};
|
||||
|
||||
return _wrapper_cpp_function(f);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void ChannelListenCallBack::HandleCallback(int state, const std::string &msg)
|
||||
{
|
||||
flutter::EncodableMap arguments;
|
||||
flutter::EncodableMap data;
|
||||
|
||||
switch (ConstDefine(state))
|
||||
{
|
||||
case ConstDefine::CHANNEL_DISMISSED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onChannelDismissed"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::CHANNEL_INFO_CHANGED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onChannelInfoChanged"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::CHANNEL_MEMBER_ADDED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onChannelMemberAdded"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::CHANNEL_MEMBER_DELETED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onChannelMemberDeleted"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
case ConstDefine::CHANNEL_MEMBER_INFO_CHANGED:
|
||||
|
||||
arguments.insert(std::make_pair("type", "onChannelMemberInfoChanged"));
|
||||
arguments.insert(std::make_pair("data", msg));
|
||||
break;
|
||||
}
|
||||
notifyEvent("channelListener", arguments);
|
||||
}
|
||||
|
||||
CB_I_S NewChannelListenCallBack()
|
||||
{
|
||||
auto t = std::make_shared<ChannelListenCallBack>();
|
||||
auto f = [t](int state, const std::string &msg)
|
||||
{
|
||||
t->HandleCallback(state, msg);
|
||||
};
|
||||
|
||||
return _wrapper_cpp_function(f);
|
||||
}
|
203
windows/src/common/services/Listen.h
Normal file
203
windows/src/common/services/Listen.h
Normal file
@ -0,0 +1,203 @@
|
||||
#ifndef LISTEN_H
|
||||
#define LISTEN_H
|
||||
|
||||
#include "flutter/encodable_value.h"
|
||||
#include "flutter/method_result.h"
|
||||
#include <libopenimsdk.h>
|
||||
|
||||
#include <functional>
|
||||
#include <string>
|
||||
#include <memory>
|
||||
#include <iostream>
|
||||
#include <bitset>
|
||||
#include <atomic>
|
||||
#include <thread>
|
||||
#include <chrono>
|
||||
#include <mutex>
|
||||
#include "../ThreadUtil.h"
|
||||
|
||||
class BaseCallBack
|
||||
{
|
||||
public:
|
||||
BaseCallBack(std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result_ptr)
|
||||
: result(result_ptr)
|
||||
{
|
||||
}
|
||||
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result = nullptr;
|
||||
|
||||
void HandleCallback(const std::string &operationID, int errCode, const std::string &errMsg,
|
||||
const std::string &data)
|
||||
{
|
||||
if (result == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Create shared pointers for the data to ensure copy constructibility
|
||||
auto resultCopy = result;
|
||||
auto dataCopy = std::make_shared<std::string>(data);
|
||||
auto errCodeCopy = errCode;
|
||||
auto errMsgCopy = std::make_shared<std::string>(errMsg);
|
||||
|
||||
// Ensure callback runs on the platform thread
|
||||
ThreadUtil::RunOnPlatformThread([resultCopy, errCodeCopy, errMsgCopy, dataCopy]()
|
||||
{
|
||||
if (errCodeCopy == 0) {
|
||||
resultCopy->Success(flutter::EncodableValue(*dataCopy));
|
||||
} else {
|
||||
resultCopy->Error(std::to_string(errCodeCopy), *errMsgCopy,
|
||||
flutter::EncodableValue(*dataCopy));
|
||||
} });
|
||||
}
|
||||
};
|
||||
|
||||
CB_S_I_S_S NewBaseCallBack(std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class InitListenCallBack
|
||||
{
|
||||
public:
|
||||
InitListenCallBack()
|
||||
{
|
||||
}
|
||||
|
||||
void HandleCallback(int state, const std::string &msg);
|
||||
};
|
||||
|
||||
CB_I_S NewInitListenCallBack();
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class UploadFileListenCallBack
|
||||
{
|
||||
public:
|
||||
UploadFileListenCallBack(std::string id) : id(id)
|
||||
{
|
||||
}
|
||||
std::string id = "";
|
||||
|
||||
void HandleCallback(int state, const std::string &msg);
|
||||
};
|
||||
|
||||
CB_I_S NewUploadFileListenCallBack(std::string id);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class UploadLogsListenCallBack
|
||||
{
|
||||
public:
|
||||
UploadLogsListenCallBack()
|
||||
{
|
||||
}
|
||||
|
||||
void HandleCallback(int state, const std::string &msg);
|
||||
};
|
||||
|
||||
CB_I_S NewUploadLogsListenCallBack();
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class UserListenCallBack
|
||||
{
|
||||
public:
|
||||
UserListenCallBack()
|
||||
{
|
||||
}
|
||||
|
||||
void HandleCallback(int state, const std::string &msg);
|
||||
};
|
||||
|
||||
CB_I_S NewUserListenCallBack();
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class AdvancedMsgListenCallBack
|
||||
{
|
||||
public:
|
||||
AdvancedMsgListenCallBack(std::string id) : id(id)
|
||||
{
|
||||
}
|
||||
std::string id = "";
|
||||
|
||||
void HandleCallback(int state, const std::string &msg);
|
||||
};
|
||||
|
||||
CB_I_S NewAdvancedMsgListenCallBack(std::string id);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class MsgSendListenerCallBack
|
||||
{
|
||||
public:
|
||||
MsgSendListenerCallBack(std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result_ptr, std::string clientMsgID) : result(result_ptr), clientMsgID(clientMsgID)
|
||||
{
|
||||
}
|
||||
std::string clientMsgID = "";
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result = nullptr;
|
||||
void HandleCallback(const std::string &operationID, int state, const std::string &error, const std::string &msg, long progress);
|
||||
};
|
||||
|
||||
CB_S_I_S_S_I NewMsgSendCallBack(std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result, std::string clientMsgID);
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class CustomBusinessListenCallBack
|
||||
{
|
||||
public:
|
||||
CustomBusinessListenCallBack()
|
||||
{
|
||||
}
|
||||
|
||||
void HandleCallback(int state, const std::string &msg);
|
||||
};
|
||||
CB_I_S NewCustomBusinessListenCallBack();
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class GroupListenerCallBack
|
||||
{
|
||||
public:
|
||||
GroupListenerCallBack()
|
||||
{
|
||||
}
|
||||
|
||||
void HandleCallback(int state, const std::string &msg);
|
||||
};
|
||||
|
||||
CB_I_S NewGroupListenerCallBack();
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class ConversationListenerCallBack
|
||||
{
|
||||
public:
|
||||
ConversationListenerCallBack()
|
||||
{
|
||||
}
|
||||
|
||||
void HandleCallback(int state, const std::string &msg);
|
||||
};
|
||||
|
||||
CB_I_S NewConversationListenerCallBack();
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class FriendshipListenCallBack
|
||||
{
|
||||
public:
|
||||
FriendshipListenCallBack()
|
||||
{
|
||||
}
|
||||
|
||||
void HandleCallback(int state, const std::string &msg);
|
||||
};
|
||||
|
||||
CB_I_S NewFriendshipListenCallBack();
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class ChannelListenCallBack {
|
||||
public:
|
||||
ChannelListenCallBack() {
|
||||
}
|
||||
|
||||
void HandleCallback(int state, const std::string& msg);
|
||||
};
|
||||
|
||||
CB_I_S NewChannelListenCallBack();
|
||||
#endif
|
900
windows/src/common/services/MessageManager.cpp
Normal file
900
windows/src/common/services/MessageManager.cpp
Normal file
@ -0,0 +1,900 @@
|
||||
#include "MessageManager.h"
|
||||
#include <libopenimsdk.h>
|
||||
#include "../NimResult.h"
|
||||
#include "../ZegoDataUtils.h"
|
||||
#include "ConstDefine.h"
|
||||
#include "Listen.h"
|
||||
|
||||
MessageManagerService::MessageManagerService() {
|
||||
m_serviceName = "messageManager";
|
||||
}
|
||||
|
||||
void MessageManagerService::onMethodCalled(
|
||||
const std::string& method,
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (method == "setAdvancedMsgListener") {
|
||||
setAdvancedMsgListener(arguments, result);
|
||||
} else if (method == "sendMessage") {
|
||||
sendMessage(arguments, result);
|
||||
} else if (method == "revokeMessage") {
|
||||
revokeMessage(arguments, result);
|
||||
} else if (method == "editMessage") {
|
||||
editMessage(arguments, result);
|
||||
} else if (method == "deleteMessageFromLocalStorage") {
|
||||
deleteMessageFromLocalStorage(arguments, result);
|
||||
} else if (method == "deleteMessageFromLocalAndSvr") {
|
||||
deleteMessageFromLocalAndSvr(arguments, result);
|
||||
} else if (method == "deleteAllMsgFromLocal") {
|
||||
deleteAllMsgFromLocal(arguments, result);
|
||||
} else if (method == "deleteAllMsgFromLocalAndSvr") {
|
||||
deleteAllMsgFromLocalAndSvr(arguments, result);
|
||||
} else if (method == "insertSingleMessageToLocalStorage") {
|
||||
insertSingleMessageToLocalStorage(arguments, result);
|
||||
} else if (method == "insertGroupMessageToLocalStorage") {
|
||||
insertGroupMessageToLocalStorage(arguments, result);
|
||||
} else if (method == "markMessagesAsReadByMsgID") {
|
||||
markMessagesAsReadByMsgID(arguments, result);
|
||||
} else if (method == "typingStatusUpdate") {
|
||||
typingStatusUpdate(arguments, result);
|
||||
} else if (method == "createTextMessage") {
|
||||
createTextMessage(arguments, result);
|
||||
} else if (method == "createTextAtMessage") {
|
||||
createTextAtMessage(arguments, result);
|
||||
} else if (method == "createImageMessage") {
|
||||
createImageMessage(arguments, result);
|
||||
} else if (method == "createImageMessageFromFullPath") {
|
||||
createImageMessageFromFullPath(arguments, result);
|
||||
} else if (method == "createSoundMessage") {
|
||||
createSoundMessage(arguments, result);
|
||||
} else if (method == "createSoundMessageFromFullPath") {
|
||||
createSoundMessageFromFullPath(arguments, result);
|
||||
} else if (method == "createVideoMessage") {
|
||||
createVideoMessage(arguments, result);
|
||||
} else if (method == "createVideoMessageFromFullPath") {
|
||||
createVideoMessageFromFullPath(arguments, result);
|
||||
} else if (method == "createFileMessage") {
|
||||
createFileMessage(arguments, result);
|
||||
} else if (method == "createFileMessageFromFullPath") {
|
||||
createFileMessageFromFullPath(arguments, result);
|
||||
} else if (method == "createMergerMessage") {
|
||||
createMergerMessage(arguments, result);
|
||||
} else if (method == "createForwardMessage") {
|
||||
createForwardMessage(arguments, result);
|
||||
} else if (method == "createLocationMessage") {
|
||||
createLocationMessage(arguments, result);
|
||||
} else if (method == "createCustomMessage") {
|
||||
createCustomMessage(arguments, result);
|
||||
} else if (method == "createQuoteMessage") {
|
||||
createQuoteMessage(arguments, result);
|
||||
} else if (method == "createCardMessage") {
|
||||
createCardMessage(arguments, result);
|
||||
} else if (method == "createFaceMessage") {
|
||||
createFaceMessage(arguments, result);
|
||||
} else if (method == "createAdvancedTextMessage") {
|
||||
createAdvancedTextMessage(arguments, result);
|
||||
} else if (method == "createAdvancedQuoteMessage") {
|
||||
createAdvancedQuoteMessage(arguments, result);
|
||||
} else if (method == "searchLocalMessages") {
|
||||
searchLocalMessages(arguments, result);
|
||||
} else if (method == "clearConversationAndDeleteAllMsg") {
|
||||
clearConversationAndDeleteAllMsg(arguments, result);
|
||||
} else if (method == "getAdvancedHistoryMessageList") {
|
||||
getAdvancedHistoryMessageList(arguments, result);
|
||||
} else if (method == "getAdvancedHistoryMessageListReverse") {
|
||||
getAdvancedHistoryMessageListReverse(arguments, result);
|
||||
} else if (method == "findMessageList") {
|
||||
findMessageList(arguments, result);
|
||||
} else if (method == "setMessageLocalEx") {
|
||||
setMessageLocalEx(arguments, result);
|
||||
} else if (method == "setAppBadge") {
|
||||
setAppBadge(arguments, result);
|
||||
} else if (method == "sendMessageNotOss") {
|
||||
sendMessageNotOss(arguments, result);
|
||||
} else if (method == "createImageMessageByURL") {
|
||||
createImageMessageByURL(arguments, result);
|
||||
} else if (method == "createSoundMessageByURL") {
|
||||
createSoundMessageByURL(arguments, result);
|
||||
} else if (method == "createVideoMessageByURL") {
|
||||
createVideoMessageByURL(arguments, result);
|
||||
} else if (method == "createFileMessageByURL") {
|
||||
createFileMessageByURL(arguments, result);
|
||||
} else if (method == "fetchSurroundingMessages") {
|
||||
fetchSurroundingMessages(arguments, result);
|
||||
} else if (method == "setCustomBusinessListener") {
|
||||
setCustomBusinessListener(arguments, result);
|
||||
} else {
|
||||
result->NotImplemented();
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::setAdvancedMsgListener(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto id = zego_value_get_string(arguments->at(flutter::EncodableValue("id")));
|
||||
set_advanced_msg_listener(NewAdvancedMsgListenCallBack(id));
|
||||
result->Success(flutter::EncodableValue());
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::sendMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto message = value_2_json(arguments->at(flutter::EncodableValue("message")));
|
||||
auto userID = zego_value_get_string(arguments->at(flutter::EncodableValue("userID")));
|
||||
auto groupID = zego_value_get_string(arguments->at(flutter::EncodableValue("groupID")));
|
||||
auto channelID = zego_value_get_string(arguments->at(flutter::EncodableValue("channelID")));
|
||||
auto offlinePushInfo = value_2_json(arguments->at(flutter::EncodableValue("offlinePushInfo")));
|
||||
auto isOnlineOnly = zego_value_get_bool(arguments->at(flutter::EncodableValue("isOnlineOnly")));
|
||||
auto json = EncodableValueToJson(arguments->at(flutter::EncodableValue("message")));
|
||||
auto clientMsgID = json["clientMsgID"].get<std::string>();
|
||||
|
||||
|
||||
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* message_cs = const_cast<char*>(message.c_str());
|
||||
char* userID_cs = const_cast<char*>(userID.c_str());
|
||||
char* groupID_cs = const_cast<char*>(groupID.c_str());
|
||||
char* channelID_cs = const_cast<char*>(channelID.c_str());
|
||||
char* offlinePushInfo_cs = const_cast<char*>(offlinePushInfo.c_str());
|
||||
|
||||
send_message(NewMsgSendCallBack(result,clientMsgID), operationID_cs, message_cs, userID_cs, groupID_cs, channelID_cs, offlinePushInfo_cs, isOnlineOnly);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::revokeMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
|
||||
auto clientMsgID = zego_value_get_string(arguments->at(flutter::EncodableValue("clientMsgID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
|
||||
char* clientMsgID_cs = const_cast<char*>(clientMsgID.c_str());
|
||||
|
||||
revoke_message(NewBaseCallBack(result), operationID_cs, conversationID_cs, clientMsgID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::editMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
|
||||
auto clientMsgID = zego_value_get_string(arguments->at(flutter::EncodableValue("clientMsgID")));
|
||||
auto message = value_2_json(arguments->at(flutter::EncodableValue("message")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
|
||||
char* clientMsgID_cs = const_cast<char*>(clientMsgID.c_str());
|
||||
char* message_cs = const_cast<char*>(message.c_str());
|
||||
|
||||
edit_message(NewBaseCallBack(result), operationID_cs, conversationID_cs, clientMsgID_cs, message_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::deleteMessageFromLocalStorage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
|
||||
auto clientMsgID = zego_value_get_string(arguments->at(flutter::EncodableValue("clientMsgID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
|
||||
char* clientMsgID_cs = const_cast<char*>(clientMsgID.c_str());
|
||||
|
||||
delete_message_from_local_storage(NewBaseCallBack(result), operationID_cs, conversationID_cs, clientMsgID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::deleteMessageFromLocalAndSvr(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
|
||||
auto clientMsgID = zego_value_get_string(arguments->at(flutter::EncodableValue("clientMsgID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
|
||||
char* clientMsgID_cs = const_cast<char*>(clientMsgID.c_str());
|
||||
|
||||
delete_message(NewBaseCallBack(result), operationID_cs, conversationID_cs, clientMsgID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::deleteAllMsgFromLocal(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
|
||||
delete_all_msg_from_local(NewBaseCallBack(result), operationID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::deleteAllMsgFromLocalAndSvr(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
|
||||
delete_all_msg_from_local_and_svr(NewBaseCallBack(result), operationID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::insertSingleMessageToLocalStorage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto message = value_2_json(arguments->at(flutter::EncodableValue("message")));
|
||||
auto receiverID = zego_value_get_string(arguments->at(flutter::EncodableValue("receiverID")));
|
||||
auto senderID = zego_value_get_string(arguments->at(flutter::EncodableValue("senderID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* message_cs = const_cast<char*>(message.c_str());
|
||||
char* receiverID_cs = const_cast<char*>(receiverID.c_str());
|
||||
char* senderID_cs = const_cast<char*>(senderID.c_str());
|
||||
|
||||
insert_single_message_to_local_storage(NewBaseCallBack(result), operationID_cs, message_cs, receiverID_cs, senderID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::insertGroupMessageToLocalStorage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto message = value_2_json(arguments->at(flutter::EncodableValue("message")));
|
||||
auto groupID = zego_value_get_string(arguments->at(flutter::EncodableValue("groupID")));
|
||||
auto channelID = zego_value_get_string(arguments->at(flutter::EncodableValue("channelID")));
|
||||
auto senderID = zego_value_get_string(arguments->at(flutter::EncodableValue("senderID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* message_cs = const_cast<char*>(message.c_str());
|
||||
char* groupID_cs = const_cast<char*>(groupID.c_str());
|
||||
char* channelID_cs = const_cast<char*>(channelID.c_str());
|
||||
char* senderID_cs = const_cast<char*>(senderID.c_str());
|
||||
|
||||
insert_group_message_to_local_storage(NewBaseCallBack(result), operationID_cs, message_cs, groupID_cs, channelID_cs, senderID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::markMessagesAsReadByMsgID(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
|
||||
auto messageIDList = value_2_json(arguments->at(flutter::EncodableValue("messageIDList")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
|
||||
char* messageIDList_cs = const_cast<char*>(messageIDList.c_str());
|
||||
|
||||
mark_messages_as_read_by_msg_id(NewBaseCallBack(result), operationID_cs, conversationID_cs, messageIDList_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::typingStatusUpdate(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto userID = zego_value_get_string(arguments->at(flutter::EncodableValue("userID")));
|
||||
auto msgTip = zego_value_get_string(arguments->at(flutter::EncodableValue("msgTip")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* userID_cs = const_cast<char*>(userID.c_str());
|
||||
char* msgTip_cs = const_cast<char*>(msgTip.c_str());
|
||||
|
||||
typing_status_update(NewBaseCallBack(result), operationID_cs, userID_cs, msgTip_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createTextMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto text = zego_value_get_string(arguments->at(flutter::EncodableValue("text")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* text_cs = const_cast<char*>(text.c_str());
|
||||
|
||||
std::string message = create_text_message(operationID_cs, text_cs);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createTextAtMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto text = zego_value_get_string(arguments->at(flutter::EncodableValue("text")));
|
||||
auto atUserIDList = value_2_json(arguments->at(flutter::EncodableValue("atUserIDList")));
|
||||
auto atUserInfoList = value_2_json(arguments->at(flutter::EncodableValue("atUserInfoList")));
|
||||
auto quoteMessage = value_2_json(arguments->at(flutter::EncodableValue("quoteMessage")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* text_cs = const_cast<char*>(text.c_str());
|
||||
char* atUserIDList_cs = const_cast<char*>(atUserIDList.c_str());
|
||||
char* atUserInfoList_cs = const_cast<char*>(atUserInfoList.c_str());
|
||||
char* quoteMessage_cs = const_cast<char*>(quoteMessage.c_str());
|
||||
|
||||
std::string message = create_text_at_message(operationID_cs, text_cs, atUserIDList_cs, atUserInfoList_cs, quoteMessage_cs);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createImageMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto imagePath = zego_value_get_string(arguments->at(flutter::EncodableValue("imagePath")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* imagePath_cs = const_cast<char*>(imagePath.c_str());
|
||||
|
||||
std::string message = create_image_message(operationID_cs, imagePath_cs);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createImageMessageFromFullPath(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto imagePath = zego_value_get_string(arguments->at(flutter::EncodableValue("imagePath")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* imagePath_cs = const_cast<char*>(imagePath.c_str());
|
||||
|
||||
std::string message = create_image_message_from_full_path(operationID_cs, imagePath_cs);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createSoundMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto soundPath = zego_value_get_string(arguments->at(flutter::EncodableValue("soundPath")));
|
||||
auto duration = zego_value_get_int(arguments->at(flutter::EncodableValue("duration")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* soundPath_cs = const_cast<char*>(soundPath.c_str());
|
||||
|
||||
std::string message = create_sound_message(operationID_cs, soundPath_cs, duration);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createSoundMessageFromFullPath(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto soundPath = zego_value_get_string(arguments->at(flutter::EncodableValue("soundPath")));
|
||||
auto duration = zego_value_get_int(arguments->at(flutter::EncodableValue("duration")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* soundPath_cs = const_cast<char*>(soundPath.c_str());
|
||||
|
||||
std::string message = create_sound_message_from_full_path(operationID_cs, soundPath_cs, duration);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createVideoMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto videoPath = zego_value_get_string(arguments->at(flutter::EncodableValue("videoPath")));
|
||||
auto videoType = zego_value_get_string(arguments->at(flutter::EncodableValue("videoType")));
|
||||
auto duration = zego_value_get_int(arguments->at(flutter::EncodableValue("duration")));
|
||||
auto snapshotPath = zego_value_get_string(arguments->at(flutter::EncodableValue("snapshotPath")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* videoPath_cs = const_cast<char*>(videoPath.c_str());
|
||||
char* videoType_cs = const_cast<char*>(videoType.c_str());
|
||||
char* snapshotPath_cs = const_cast<char*>(snapshotPath.c_str());
|
||||
|
||||
std::string message = create_video_message(operationID_cs, videoPath_cs, videoType_cs, duration, snapshotPath_cs);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createVideoMessageFromFullPath(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto videoPath = zego_value_get_string(arguments->at(flutter::EncodableValue("videoPath")));
|
||||
auto videoType = zego_value_get_string(arguments->at(flutter::EncodableValue("videoType")));
|
||||
auto duration = zego_value_get_int(arguments->at(flutter::EncodableValue("duration")));
|
||||
auto snapshotPath = zego_value_get_string(arguments->at(flutter::EncodableValue("snapshotPath")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* videoPath_cs = const_cast<char*>(videoPath.c_str());
|
||||
char* videoType_cs = const_cast<char*>(videoType.c_str());
|
||||
char* snapshotPath_cs = const_cast<char*>(snapshotPath.c_str());
|
||||
|
||||
std::string message = create_video_message_from_full_path(operationID_cs, videoPath_cs, videoType_cs, duration, snapshotPath_cs);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createFileMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto filePath = zego_value_get_string(arguments->at(flutter::EncodableValue("filePath")));
|
||||
auto fileName = zego_value_get_string(arguments->at(flutter::EncodableValue("fileName")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* filePath_cs = const_cast<char*>(filePath.c_str());
|
||||
char* fileName_cs = const_cast<char*>(fileName.c_str());
|
||||
|
||||
std::string message = create_file_message(operationID_cs, filePath_cs, fileName_cs);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createFileMessageFromFullPath(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto filePath = zego_value_get_string(arguments->at(flutter::EncodableValue("filePath")));
|
||||
auto fileName = zego_value_get_string(arguments->at(flutter::EncodableValue("fileName")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* filePath_cs = const_cast<char*>(filePath.c_str());
|
||||
char* fileName_cs = const_cast<char*>(fileName.c_str());
|
||||
|
||||
std::string message = create_file_message_from_full_path(operationID_cs, filePath_cs, fileName_cs);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createMergerMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto messageList = value_2_json(arguments->at(flutter::EncodableValue("messageList")));
|
||||
auto title = zego_value_get_string(arguments->at(flutter::EncodableValue("title")));
|
||||
auto summaryList = value_2_json(arguments->at(flutter::EncodableValue("summaryList")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* messageList_cs = const_cast<char*>(messageList.c_str());
|
||||
char* title_cs = const_cast<char*>(title.c_str());
|
||||
char* summaryList_cs = const_cast<char*>(summaryList.c_str());
|
||||
|
||||
std::string message = create_merger_message(operationID_cs, messageList_cs, title_cs, summaryList_cs);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createForwardMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto message = value_2_json(arguments->at(flutter::EncodableValue("message")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* message_cs = const_cast<char*>(message.c_str());
|
||||
|
||||
std::string resultMessage = create_forward_message(operationID_cs, message_cs);
|
||||
result->Success(flutter::EncodableValue(resultMessage));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createLocationMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto description = zego_value_get_string(arguments->at(flutter::EncodableValue("description")));
|
||||
auto longitude = zego_value_get_double(arguments->at(flutter::EncodableValue("longitude")));
|
||||
auto latitude = zego_value_get_double(arguments->at(flutter::EncodableValue("latitude")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* description_cs = const_cast<char*>(description.c_str());
|
||||
|
||||
|
||||
std::string message = create_location_message(operationID_cs, description_cs, longitude, latitude);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createCustomMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto data = zego_value_get_string(arguments->at(flutter::EncodableValue("data")));
|
||||
auto extension = zego_value_get_string(arguments->at(flutter::EncodableValue("extension")));
|
||||
auto description = zego_value_get_string(arguments->at(flutter::EncodableValue("description")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* data_cs = const_cast<char*>(data.c_str());
|
||||
char* extension_cs = const_cast<char*>(extension.c_str());
|
||||
char* description_cs = const_cast<char*>(description.c_str());
|
||||
|
||||
std::string message = create_custom_message(operationID_cs, data_cs, extension_cs, description_cs);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createQuoteMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto quoteText = zego_value_get_string(arguments->at(flutter::EncodableValue("quoteText")));
|
||||
auto quoteMessage = value_2_json(arguments->at(flutter::EncodableValue("quoteMessage")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* quoteText_cs = const_cast<char*>(quoteText.c_str());
|
||||
char* quoteMessage_cs = const_cast<char*>(quoteMessage.c_str());
|
||||
|
||||
std::string message = create_quote_message(operationID_cs, quoteText_cs, quoteMessage_cs);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createCardMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto cardMessage = value_2_json(arguments->at(flutter::EncodableValue("cardMessage")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* cardMessage_cs = const_cast<char*>(cardMessage.c_str());
|
||||
|
||||
std::string message = create_card_message(operationID_cs, cardMessage_cs);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createFaceMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto index = zego_value_get_int(arguments->at(flutter::EncodableValue("index")));
|
||||
auto data = zego_value_get_string(arguments->at(flutter::EncodableValue("data")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* data_cs = const_cast<char*>(data.c_str());
|
||||
|
||||
std::string message = create_face_message(operationID_cs, index, data_cs);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createAdvancedTextMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto text = zego_value_get_string(arguments->at(flutter::EncodableValue("text")));
|
||||
auto richMessageInfoList = value_2_json(arguments->at(flutter::EncodableValue("richMessageInfoList")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* text_cs = const_cast<char*>(text.c_str());
|
||||
char* richMessageInfoList_cs = const_cast<char*>(richMessageInfoList.c_str());
|
||||
|
||||
std::string message = create_advanced_text_message(operationID_cs, text_cs, richMessageInfoList_cs);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createAdvancedQuoteMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto quoteText = zego_value_get_string(arguments->at(flutter::EncodableValue("quoteText")));
|
||||
auto quoteMessage = value_2_json(arguments->at(flutter::EncodableValue("quoteMessage")));
|
||||
auto richMessageInfoList = value_2_json(arguments->at(flutter::EncodableValue("richMessageInfoList")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* quoteText_cs = const_cast<char*>(quoteText.c_str());
|
||||
char* quoteMessage_cs = const_cast<char*>(quoteMessage.c_str());
|
||||
char* richMessageInfoList_cs = const_cast<char*>(richMessageInfoList.c_str());
|
||||
|
||||
std::string message = create_advanced_quote_message(operationID_cs, quoteText_cs, quoteMessage_cs, richMessageInfoList_cs);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::searchLocalMessages(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto filter = value_2_json(arguments->at(flutter::EncodableValue("filter")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* filter_cs = const_cast<char*>(filter.c_str());
|
||||
|
||||
search_local_messages(NewBaseCallBack(result), operationID_cs, filter_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::clearConversationAndDeleteAllMsg(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
|
||||
|
||||
clear_conversation_and_delete_all_msg(NewBaseCallBack(result), operationID_cs, conversationID_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::getAdvancedHistoryMessageList(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto params = map_2_json(*arguments);
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* params_cs = const_cast<char*>(params.c_str());
|
||||
|
||||
get_advanced_history_message_list(NewBaseCallBack(result), operationID_cs, params_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::getAdvancedHistoryMessageListReverse(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto params = map_2_json(*arguments);
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* params_cs = const_cast<char*>(params.c_str());
|
||||
|
||||
get_advanced_history_message_list_reverse(NewBaseCallBack(result), operationID_cs, params_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::findMessageList(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto searchParams = value_2_json(arguments->at(flutter::EncodableValue("searchParams")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* searchParams_cs = const_cast<char*>(searchParams.c_str());
|
||||
|
||||
find_message_list(NewBaseCallBack(result), operationID_cs, searchParams_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::setMessageLocalEx(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto conversationID = zego_value_get_string(arguments->at(flutter::EncodableValue("conversationID")));
|
||||
auto clientMsgID = zego_value_get_string(arguments->at(flutter::EncodableValue("clientMsgID")));
|
||||
auto localEx = zego_value_get_string(arguments->at(flutter::EncodableValue("localEx")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* conversationID_cs = const_cast<char*>(conversationID.c_str());
|
||||
char* clientMsgID_cs = const_cast<char*>(clientMsgID.c_str());
|
||||
char* localEx_cs = const_cast<char*>(localEx.c_str());
|
||||
|
||||
set_message_local_ex(NewBaseCallBack(result), operationID_cs, conversationID_cs, clientMsgID_cs, localEx_cs);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::setAppBadge(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto count = zego_value_get_int(arguments->at(flutter::EncodableValue("count")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
|
||||
set_app_Badge(NewBaseCallBack(result), operationID_cs, count);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::sendMessageNotOss(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto message = value_2_json(arguments->at(flutter::EncodableValue("message")));
|
||||
auto userID = zego_value_get_string(arguments->at(flutter::EncodableValue("userID")));
|
||||
auto groupID = zego_value_get_string(arguments->at(flutter::EncodableValue("groupID")));
|
||||
auto channelId = zego_value_get_string(arguments->at(flutter::EncodableValue("channelId")));
|
||||
auto offlinePushInfo = value_2_json(arguments->at(flutter::EncodableValue("offlinePushInfo")));
|
||||
auto isOnlineOnly = zego_value_get_bool(arguments->at(flutter::EncodableValue("isOnlineOnly")));
|
||||
|
||||
auto json = EncodableValueToJson(arguments->at(flutter::EncodableValue("message")));
|
||||
auto clientMsgID = json["clientMsgID"].get<std::string>();
|
||||
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* message_cs = const_cast<char*>(message.c_str());
|
||||
char* userID_cs = const_cast<char*>(userID.c_str());
|
||||
char* groupID_cs = const_cast<char*>(groupID.c_str());
|
||||
char* channelId_cs = const_cast<char*>(channelId.c_str());
|
||||
char* offlinePushInfo_cs = const_cast<char*>(offlinePushInfo.c_str());
|
||||
|
||||
send_message_not_oss(NewMsgSendCallBack(result,clientMsgID), operationID_cs, message_cs, userID_cs, groupID_cs, channelId_cs, offlinePushInfo_cs, isOnlineOnly);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createImageMessageByURL(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto sourcePath = zego_value_get_string(arguments->at(flutter::EncodableValue("sourcePath")));
|
||||
auto sourcePicture = value_2_json(arguments->at(flutter::EncodableValue("sourcePicture")));
|
||||
auto bigPicture = value_2_json(arguments->at(flutter::EncodableValue("bigPicture")));
|
||||
auto snapshotPicture = value_2_json(arguments->at(flutter::EncodableValue("snapshotPicture")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* sourcePath_cs = const_cast<char*>(sourcePath.c_str());
|
||||
char* sourcePicture_cs = const_cast<char*>(sourcePicture.c_str());
|
||||
char* bigPicture_cs = const_cast<char*>(bigPicture.c_str());
|
||||
char* snapshotPicture_cs = const_cast<char*>(snapshotPicture.c_str());
|
||||
|
||||
std::string message = create_image_message_by_url(operationID_cs, sourcePath_cs, sourcePicture_cs, bigPicture_cs, snapshotPicture_cs);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createSoundMessageByURL(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto soundElem = value_2_json(arguments->at(flutter::EncodableValue("soundElem")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* soundElem_cs = const_cast<char*>(soundElem.c_str());
|
||||
|
||||
std::string message = create_sound_message_by_url(operationID_cs, soundElem_cs);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createVideoMessageByURL(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto videoElem = value_2_json(arguments->at(flutter::EncodableValue("videoElem")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* videoElem_cs = const_cast<char*>(videoElem.c_str());
|
||||
|
||||
std::string message = create_video_message_by_url(operationID_cs, videoElem_cs);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::createFileMessageByURL(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto fileElem = value_2_json(arguments->at(flutter::EncodableValue("fileElem")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* fileElem_cs = const_cast<char*>(fileElem.c_str());
|
||||
|
||||
std::string message = create_file_message_by_url(operationID_cs, fileElem_cs);
|
||||
result->Success(flutter::EncodableValue(message));
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::fetchSurroundingMessages(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto message = value_2_json(arguments->at(flutter::EncodableValue("message")));
|
||||
auto before = zego_value_get_int(arguments->at(flutter::EncodableValue("before")));
|
||||
auto after = zego_value_get_int(arguments->at(flutter::EncodableValue("after")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* message_cs = const_cast<char*>(message.c_str());
|
||||
|
||||
fetch_surrounding_messages(NewBaseCallBack(result), operationID_cs, message_cs, before, after);
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void MessageManagerService::setCustomBusinessListener(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
set_custom_business_listener(NewCustomBusinessListenCallBack());
|
||||
result->Success(flutter::EncodableValue());
|
||||
} else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
158
windows/src/common/services/MessageManager.h
Normal file
158
windows/src/common/services/MessageManager.h
Normal file
@ -0,0 +1,158 @@
|
||||
#ifndef MESSAGE_MANAGER_SERVICE_H
|
||||
#define MESSAGE_MANAGER_SERVICE_H
|
||||
#include "../FLTService.h"
|
||||
#include "Listen.h"
|
||||
#include <flutter/standard_method_codec.h>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
class MessageManagerService : public FLTService {
|
||||
public:
|
||||
MessageManagerService();
|
||||
|
||||
virtual void onMethodCalled(
|
||||
const std::string& method, const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
override;
|
||||
|
||||
// Method handlers
|
||||
void setAdvancedMsgListener(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void sendMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void revokeMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void editMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void deleteMessageFromLocalStorage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void deleteMessageFromLocalAndSvr(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void deleteAllMsgFromLocal(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void deleteAllMsgFromLocalAndSvr(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void insertSingleMessageToLocalStorage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void insertGroupMessageToLocalStorage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void markMessagesAsReadByMsgID(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void typingStatusUpdate(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createTextMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createTextAtMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createImageMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createImageMessageFromFullPath(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createSoundMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createSoundMessageFromFullPath(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createVideoMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createVideoMessageFromFullPath(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createFileMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createFileMessageFromFullPath(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createMergerMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createForwardMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createLocationMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createCustomMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createQuoteMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createCardMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createFaceMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createAdvancedTextMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createAdvancedQuoteMessage(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void searchLocalMessages(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void clearConversationAndDeleteAllMsg(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getAdvancedHistoryMessageList(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getAdvancedHistoryMessageListReverse(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void findMessageList(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void setMessageLocalEx(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void setAppBadge(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void sendMessageNotOss(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createImageMessageByURL(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createSoundMessageByURL(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createVideoMessageByURL(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void createFileMessageByURL(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void fetchSurroundingMessages(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void setCustomBusinessListener(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif // MESSAGE_MANAGER_SERVICE_H
|
166
windows/src/common/services/UserManager.cpp
Normal file
166
windows/src/common/services/UserManager.cpp
Normal file
@ -0,0 +1,166 @@
|
||||
#include "UserManager.h"
|
||||
#include <libopenimsdk.h>
|
||||
#include "../NimResult.h"
|
||||
#include "../ZegoDataUtils.h"
|
||||
#include "ConstDefine.h"
|
||||
#include "Listen.h"
|
||||
|
||||
UserManagerService::UserManagerService() {
|
||||
m_serviceName = "userManager";
|
||||
}
|
||||
|
||||
void UserManagerService::onMethodCalled(
|
||||
const std::string& method,
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (method == "setUserListener") {
|
||||
setUserListener(arguments, result);
|
||||
}
|
||||
else if (method == "getUsersInfo") {
|
||||
getUsersInfo(arguments, result);
|
||||
}
|
||||
else if (method == "setSelfInfo") {
|
||||
setSelfInfo(arguments, result);
|
||||
}
|
||||
else if (method == "getSelfUserInfo") {
|
||||
getSelfUserInfo(arguments, result);
|
||||
}
|
||||
else if (method == "subscribeUsersStatus") {
|
||||
subscribeUsersStatus(arguments, result);
|
||||
}
|
||||
else if (method == "unsubscribeUsersStatus") {
|
||||
unsubscribeUsersStatus(arguments, result);
|
||||
}
|
||||
else if (method == "getSubscribeUsersStatus") {
|
||||
getSubscribeUsersStatus(arguments, result);
|
||||
}
|
||||
else if (method == "getUserStatus") {
|
||||
getUserStatus(arguments, result);
|
||||
}
|
||||
else {
|
||||
result->NotImplemented();
|
||||
}
|
||||
}
|
||||
|
||||
void UserManagerService::setUserListener(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
set_user_listener(NewUserListenCallBack());
|
||||
result->Success(flutter::EncodableValue());
|
||||
}
|
||||
else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void UserManagerService::getUsersInfo(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto userIDList = value_2_json(arguments->at(flutter::EncodableValue("userIDList")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* userIDList_cs = const_cast<char*>(userIDList.c_str());
|
||||
|
||||
get_users_info(NewBaseCallBack(result), operationID_cs, userIDList_cs);
|
||||
}
|
||||
else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void UserManagerService::setSelfInfo(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto userInfo = map_2_json(*arguments);
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* userInfo_cs = const_cast<char*>(userInfo.c_str());
|
||||
|
||||
set_self_info(NewBaseCallBack(result), operationID_cs, userInfo_cs);
|
||||
}
|
||||
else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void UserManagerService::getSelfUserInfo(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
|
||||
get_self_user_info(NewBaseCallBack(result), operationID_cs);
|
||||
}
|
||||
else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void UserManagerService::subscribeUsersStatus(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto userIDs = value_2_json(arguments->at(flutter::EncodableValue("userIDs")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* userIDs_cs = const_cast<char*>(userIDs.c_str());
|
||||
|
||||
subscribe_users_status(NewBaseCallBack(result), operationID_cs, userIDs_cs);
|
||||
}
|
||||
else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void UserManagerService::unsubscribeUsersStatus(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto userIDs = value_2_json(arguments->at(flutter::EncodableValue("userIDs")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* userIDs_cs = const_cast<char*>(userIDs.c_str());
|
||||
|
||||
unsubscribe_users_status(NewBaseCallBack(result), operationID_cs, userIDs_cs);
|
||||
}
|
||||
else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void UserManagerService::getSubscribeUsersStatus(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
|
||||
get_subscribe_users_status(NewBaseCallBack(result), operationID_cs);
|
||||
}
|
||||
else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
void UserManagerService::getUserStatus(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
||||
if (arguments) {
|
||||
auto operationID = zego_value_get_string(arguments->at(flutter::EncodableValue("operationID")));
|
||||
auto userIDs = value_2_json(arguments->at(flutter::EncodableValue("userIDs")));
|
||||
char* operationID_cs = const_cast<char*>(operationID.c_str());
|
||||
char* userIDs_cs = const_cast<char*>(userIDs.c_str());
|
||||
|
||||
get_user_status(NewBaseCallBack(result), operationID_cs, userIDs_cs);
|
||||
}
|
||||
else {
|
||||
result->Error("INVALID_ARGUMENT", "Arguments cannot be null");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
48
windows/src/common/services/UserManager.h
Normal file
48
windows/src/common/services/UserManager.h
Normal file
@ -0,0 +1,48 @@
|
||||
#ifndef USER_MANAGER_SERVICE_H
|
||||
#define USER_MANAGER_SERVICE_H
|
||||
|
||||
#include "../FLTService.h"
|
||||
#include "Listen.h"
|
||||
#include <flutter/standard_method_codec.h>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
class UserManagerService : public FLTService {
|
||||
public:
|
||||
UserManagerService();
|
||||
|
||||
virtual void onMethodCalled(
|
||||
const std::string& method, const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result)
|
||||
override;
|
||||
|
||||
// Method handlers
|
||||
void setUserListener(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getUsersInfo(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void setSelfInfo(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getSelfUserInfo(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void subscribeUsersStatus(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void unsubscribeUsersStatus(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getSubscribeUsersStatus(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
void getUserStatus(
|
||||
const flutter::EncodableMap* arguments,
|
||||
std::shared_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif // USER_MANAGER_SERVICE_H
|
311
windows/src/common/services/wrapp_cpp_function.inc
Normal file
311
windows/src/common/services/wrapp_cpp_function.inc
Normal file
@ -0,0 +1,311 @@
|
||||
/*
|
||||
Using C++ template functions and recursion to initialize a function pointer pool,
|
||||
combined with lambda expressions, this implementation manages function pointers,
|
||||
achieving acquisition and release of pointers.All wrappers are used to convert
|
||||
and map C++ functions to C functions, and with the use of indexed locking,
|
||||
a thread-safe function pointer pool is implemented.For example, the wrapping
|
||||
functions essentially map C++ functions to C functions. When a C function callback is triggered,
|
||||
the function pointer pool, initialized through template recursion, locates the corresponding C++ function and invokes it.
|
||||
*/
|
||||
|
||||
#define MAX_NUM_OF_CB_S 10
|
||||
#define MAX_NUM_OF_CB_I_S 10
|
||||
#define MAX_NUM_OF_CB_S_I_S_S 10
|
||||
#define MAX_NUM_OF_CB_S_I_S_S_I 10
|
||||
#define SLEEP_TIME_FOR_GET_INDEX 100 //ms
|
||||
|
||||
// use recursive template to generate enough function pointer array
|
||||
// and define c type function interface
|
||||
// and define manager class to manage function pool
|
||||
namespace {
|
||||
CB_S* _fps_cb_s=new CB_S[MAX_NUM_OF_CB_S];
|
||||
CB_I_S* _fps_cb_i_s=new CB_I_S[MAX_NUM_OF_CB_I_S];
|
||||
CB_S_I_S_S* _fps_cb_s_i_s_s=new CB_S_I_S_S[MAX_NUM_OF_CB_S_I_S_S];
|
||||
CB_S_I_S_S_I* _fps_cb_s_i_s_s_i=new CB_S_I_S_S_I[MAX_NUM_OF_CB_S_I_S_S_I];
|
||||
// c type func interface call cpp function
|
||||
std::function<void(const std::string&)>* _cpp_function_cb_s=new std::function<void(const std::string&)>[MAX_NUM_OF_CB_S];
|
||||
std::function<void(int,const std::string&)>* _cpp_function_cb_i_s=new std::function<void(int,const std::string&)>[MAX_NUM_OF_CB_I_S];
|
||||
std::function<void(const std::string&,int,const std::string&,const std::string&)>* _cpp_function_cb_s_i_s_s=new std::function<void(const std::string&,int,const std::string&,const std::string&)>[MAX_NUM_OF_CB_S_I_S_S];
|
||||
std::function<void(const std::string&,int,const std::string&,const std::string&,int)>* _cpp_function_cb_s_i_s_s_i=new std::function<void(const std::string&,int,const std::string&,const std::string&,int)>[MAX_NUM_OF_CB_S_I_S_S_I];
|
||||
|
||||
template<int N>
|
||||
void _generate_cb_s(){
|
||||
_fps_cb_s[N]=[](char* c_str){
|
||||
_cpp_function_cb_s[N](std::string(c_str));
|
||||
};
|
||||
_generate_cb_s<N-1>();
|
||||
}
|
||||
template<>
|
||||
void _generate_cb_s<0>(){
|
||||
_fps_cb_s[0]=[](char* c_str){
|
||||
_cpp_function_cb_s[0](std::string(c_str));
|
||||
};
|
||||
}
|
||||
|
||||
template<int N>
|
||||
void _generate_cb_i_s(){
|
||||
_fps_cb_i_s[N]=[](int code,char* c_str){
|
||||
_cpp_function_cb_i_s[N](code,std::string(c_str));
|
||||
};
|
||||
_generate_cb_i_s<N-1>();
|
||||
}
|
||||
template<>
|
||||
void _generate_cb_i_s<0>(){
|
||||
_fps_cb_i_s[0]=[](int code,char* c_str){
|
||||
_cpp_function_cb_i_s[0](code,std::string(c_str));
|
||||
};
|
||||
}
|
||||
template<int N>
|
||||
void _generate_cb_s_i_s_s(){
|
||||
_fps_cb_s_i_s_s[N]=[](char* operationID,int code,char* c_str,char* c_str2){
|
||||
_cpp_function_cb_s_i_s_s[N](std::string(operationID),code,std::string(c_str),std::string(c_str2));
|
||||
};
|
||||
_generate_cb_s_i_s_s<N-1>();
|
||||
}
|
||||
template<>
|
||||
void _generate_cb_s_i_s_s<0>(){
|
||||
_fps_cb_s_i_s_s[0]=[](char* operationID,int code,char* c_str,char* c_str2){
|
||||
_cpp_function_cb_s_i_s_s[0](std::string(operationID),code,std::string(c_str),std::string(c_str2));
|
||||
};
|
||||
}
|
||||
template<int N>
|
||||
void _generate_cb_s_i_s_s_i(){
|
||||
_fps_cb_s_i_s_s_i[N]=[](char* operationID,int code,char* c_str,char* c_str2,int c_int){
|
||||
_cpp_function_cb_s_i_s_s_i[N](std::string(operationID),code,std::string(c_str),std::string(c_str2),c_int);
|
||||
};
|
||||
_generate_cb_s_i_s_s_i<N-1>();
|
||||
}
|
||||
template<>
|
||||
void _generate_cb_s_i_s_s_i<0>(){
|
||||
_fps_cb_s_i_s_s_i[0]=[](char* operationID,int code,char* c_str,char* c_str2,int c_int){
|
||||
_cpp_function_cb_s_i_s_s_i[0](std::string(operationID),code,std::string(c_str),std::string(c_str2),c_int);
|
||||
};
|
||||
}
|
||||
|
||||
// init global function pointer array
|
||||
void init(){
|
||||
_generate_cb_s<MAX_NUM_OF_CB_S-1>();
|
||||
_generate_cb_i_s<MAX_NUM_OF_CB_I_S-1>();
|
||||
_generate_cb_s_i_s_s<MAX_NUM_OF_CB_S_I_S_S-1>();
|
||||
_generate_cb_s_i_s_s_i<MAX_NUM_OF_CB_S_I_S_S_I-1>();
|
||||
}
|
||||
// define sigle instance class to manage function pool
|
||||
class FuncPoolManager{
|
||||
private:
|
||||
// define a global bitmap, and support atomic operation, to manage cb_s pool
|
||||
std::bitset<MAX_NUM_OF_CB_S> _cb_s_bitmap;
|
||||
std::bitset<MAX_NUM_OF_CB_I_S> _cb_i_s_bitmap;
|
||||
std::bitset<MAX_NUM_OF_CB_S_I_S_S> _cb_s_i_s_s_bitmap;
|
||||
std::bitset<MAX_NUM_OF_CB_S_I_S_S_I> _cb_s_i_s_s_i_bitmap;
|
||||
std::mutex _cb_s_mutex;
|
||||
std::mutex _cb_i_s_mutex;
|
||||
std::mutex _cb_s_i_s_s_mutex;
|
||||
std::mutex _cb_s_i_s_s_i_mutex;
|
||||
FuncPoolManager(){
|
||||
init();
|
||||
}
|
||||
FuncPoolManager(const FuncPoolManager&){}
|
||||
public:
|
||||
static FuncPoolManager& get_instance(){
|
||||
static FuncPoolManager instance;
|
||||
return instance;
|
||||
}
|
||||
// get a available cb_s function index
|
||||
int get_cb_s_index(){
|
||||
std::lock_guard<std::mutex> lock(_cb_s_mutex);
|
||||
int index=-1;
|
||||
for(int i=0;i<_cb_s_bitmap.size();i++){
|
||||
if(_cb_s_bitmap[i]==0){
|
||||
_cb_s_bitmap[i]=1;
|
||||
index=i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return index;
|
||||
}
|
||||
// get a available cb_i_s function index
|
||||
int get_cb_i_s_index(){
|
||||
std::lock_guard<std::mutex> lock(_cb_i_s_mutex);
|
||||
int index=-1;
|
||||
for(int i=0;i<_cb_i_s_bitmap.size();i++){
|
||||
if(_cb_i_s_bitmap[i]==0){
|
||||
_cb_i_s_bitmap[i]=1;
|
||||
index=i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return index;
|
||||
}
|
||||
// get a available cb_s_i_s_s function index
|
||||
int get_cb_s_i_s_s_index(){
|
||||
std::lock_guard<std::mutex> lock(_cb_s_i_s_s_mutex);
|
||||
int index=-1;
|
||||
for(int i=0;i<_cb_s_i_s_s_bitmap.size();i++){
|
||||
if(_cb_s_i_s_s_bitmap[i]==0){
|
||||
_cb_s_i_s_s_bitmap[i]=1;
|
||||
index=i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return index;
|
||||
}
|
||||
// get a available cb_s_i_s_s_i function index
|
||||
int get_cb_s_i_s_s_i_index(){
|
||||
std::lock_guard<std::mutex> lock(_cb_s_i_s_s_i_mutex);
|
||||
int index=-1;
|
||||
for(int i=0;i<_cb_s_i_s_s_i_bitmap.size();i++){
|
||||
if(_cb_s_i_s_s_i_bitmap[i]==0){
|
||||
_cb_s_i_s_s_i_bitmap[i]=1;
|
||||
index=i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return index;
|
||||
}
|
||||
// release a available cb_s function index
|
||||
int release_cb_s_index(int index){
|
||||
std::lock_guard<std::mutex> lock(_cb_s_mutex);
|
||||
if(index<0||index>=_cb_s_bitmap.size()){
|
||||
return -1;
|
||||
}
|
||||
_cpp_function_cb_s[index]=nullptr;
|
||||
_cb_s_bitmap[index]=0;
|
||||
return 0;
|
||||
}
|
||||
// release a available cb_i_s function index
|
||||
int release_cb_i_s_index(int index){
|
||||
std::lock_guard<std::mutex> lock(_cb_i_s_mutex);
|
||||
if(index<0||index>=_cb_i_s_bitmap.size()){
|
||||
return -1;
|
||||
}
|
||||
_cpp_function_cb_i_s[index]=nullptr;
|
||||
_cb_i_s_bitmap[index]=0;
|
||||
return 0;
|
||||
}
|
||||
// release a available cb_s_i_s_s function index
|
||||
int release_cb_s_i_s_s_index(int index){
|
||||
std::lock_guard<std::mutex> lock(_cb_s_i_s_s_mutex);
|
||||
if(index<0||index>=_cb_s_i_s_s_bitmap.size()){
|
||||
return -1;
|
||||
}
|
||||
_cpp_function_cb_s_i_s_s[index]=nullptr;
|
||||
_cb_s_i_s_s_bitmap[index]=0;
|
||||
return 0;
|
||||
}
|
||||
// release a available cb_s_i_s_s_i function index
|
||||
int release_cb_s_i_s_s_i_index(int index){
|
||||
std::lock_guard<std::mutex> lock(_cb_s_i_s_s_i_mutex);
|
||||
if(index<0||index>=_cb_s_i_s_s_i_bitmap.size()){
|
||||
return -1;
|
||||
}
|
||||
_cpp_function_cb_s_i_s_s_i[index]=nullptr;
|
||||
_cb_s_i_s_s_i_bitmap[index]=0;
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
FuncPoolManager& instance=FuncPoolManager::get_instance();
|
||||
|
||||
// wrapper persistent function
|
||||
// wrapp CB_S,if function pool is full,return nullptr
|
||||
CB_S _wrapper_cpp_function(const std::function<void(const std::string&)>& cpp_function) {
|
||||
int index=FuncPoolManager::get_instance().get_cb_s_index();
|
||||
while(index<0){
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX));
|
||||
index=FuncPoolManager::get_instance().get_cb_s_index();
|
||||
}
|
||||
_cpp_function_cb_s[index]=cpp_function;
|
||||
return _fps_cb_s[index];
|
||||
}
|
||||
// wrapp CB_I_S
|
||||
CB_I_S _wrapper_cpp_function(const std::function<void(int,const std::string&)>& cpp_function)
|
||||
{
|
||||
int index=FuncPoolManager::get_instance().get_cb_i_s_index();
|
||||
while(index<0){
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX));
|
||||
index=FuncPoolManager::get_instance().get_cb_i_s_index();
|
||||
}
|
||||
_cpp_function_cb_i_s[index]=cpp_function;
|
||||
return _fps_cb_i_s[index];
|
||||
}
|
||||
// wrapp CB_S_I_S_S
|
||||
CB_S_I_S_S _wrapper_cpp_function(const std::function<void(const std::string&,int,const std::string&,const std::string&)>& cpp_function)
|
||||
{
|
||||
int index=FuncPoolManager::get_instance().get_cb_s_i_s_s_index();
|
||||
while(index<0){
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX));
|
||||
index=FuncPoolManager::get_instance().get_cb_s_i_s_s_index();
|
||||
}
|
||||
_cpp_function_cb_s_i_s_s[index]=cpp_function;
|
||||
return _fps_cb_s_i_s_s[index];
|
||||
}
|
||||
// wrapp CB_S_I_S_S_I
|
||||
CB_S_I_S_S_I _wrapper_cpp_function(const std::function<void(const std::string&,int,const std::string&,const std::string&,int)>& cpp_function)
|
||||
{
|
||||
int index=FuncPoolManager::get_instance().get_cb_s_i_s_s_i_index();
|
||||
while(index<0){
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX));
|
||||
index=FuncPoolManager::get_instance().get_cb_s_i_s_s_i_index();
|
||||
}
|
||||
_cpp_function_cb_s_i_s_s_i[index]=cpp_function;
|
||||
return _fps_cb_s_i_s_s_i[index];
|
||||
}
|
||||
|
||||
// wrapp function to onetime function
|
||||
CB_S _wrapper_callonce_cpp_function(const std::function<void(const std::string&)>& cpp_function) {
|
||||
int index=FuncPoolManager::get_instance().get_cb_s_index();
|
||||
while(index<0){
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX));
|
||||
index=FuncPoolManager::get_instance().get_cb_s_index();
|
||||
}
|
||||
_cpp_function_cb_s[index]=[cpp_function,index](const std::string& str)->void {
|
||||
cpp_function(str);
|
||||
FuncPoolManager::get_instance().release_cb_s_index(index);
|
||||
};
|
||||
return _fps_cb_s[index];
|
||||
}
|
||||
|
||||
CB_I_S _wrapper_callonce_cpp_function(const std::function<void(int,const std::string&)>& cpp_function)
|
||||
{
|
||||
int index=FuncPoolManager::get_instance().get_cb_i_s_index();
|
||||
while(index<0){
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX));
|
||||
index=FuncPoolManager::get_instance().get_cb_i_s_index();
|
||||
}
|
||||
_cpp_function_cb_i_s[index]=[cpp_function,index](int code,const std::string& str)->void {
|
||||
cpp_function(code,str);
|
||||
FuncPoolManager::get_instance().release_cb_i_s_index(index);
|
||||
};
|
||||
return _fps_cb_i_s[index];
|
||||
}
|
||||
|
||||
CB_S_I_S_S _wrapper_callonce_cpp_function(const std::function<void(const std::string&,int,const std::string&,const std::string&)>& cpp_function)
|
||||
{
|
||||
int index=FuncPoolManager::get_instance().get_cb_s_i_s_s_index();
|
||||
while(index<0){
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX));
|
||||
index=FuncPoolManager::get_instance().get_cb_s_i_s_s_index();
|
||||
}
|
||||
_cpp_function_cb_s_i_s_s[index]=[cpp_function,index](const std::string& operationID,int code,const std::string& str,const std::string& str2)->void {
|
||||
cpp_function(operationID,code,str,str2);
|
||||
FuncPoolManager::get_instance().release_cb_s_i_s_s_index(index);
|
||||
};
|
||||
return _fps_cb_s_i_s_s[index];
|
||||
}
|
||||
|
||||
CB_S_I_S_S_I _wrapper_callonce_cpp_function(const std::function<void(const std::string&,int,const std::string&,const std::string&,int)>& cpp_function)
|
||||
{
|
||||
int index=FuncPoolManager::get_instance().get_cb_s_i_s_s_i_index();
|
||||
// while loop util get a available index
|
||||
while(index<0){
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX));
|
||||
index=FuncPoolManager::get_instance().get_cb_s_i_s_s_i_index();
|
||||
}
|
||||
_cpp_function_cb_s_i_s_s_i[index]=[cpp_function,index](const std::string& operationID,int code,const std::string& str,const std::string& str2,int c_int)->void {
|
||||
cpp_function(operationID,code,str,str2,c_int);
|
||||
FuncPoolManager::get_instance().release_cb_s_i_s_s_i_index(index);
|
||||
};
|
||||
return _fps_cb_s_i_s_s_i[index];
|
||||
}
|
||||
|
||||
}
|
||||
|
40
windows/src/common/stable.h
Normal file
40
windows/src/common/stable.h
Normal file
@ -0,0 +1,40 @@
|
||||
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
|
||||
// Use of this source code is governed by a MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef STABLE_H
|
||||
#define STABLE_H
|
||||
|
||||
#if defined __cplusplus
|
||||
|
||||
// std
|
||||
#include <any>
|
||||
#include <filesystem>
|
||||
#include <functional>
|
||||
#include <iostream>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <optional>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
#endif
|
||||
#include "utils/singleton.h"
|
||||
#include "utils/stringHash.hpp"
|
||||
|
||||
// third parties
|
||||
#include "alog.h"
|
||||
#define YXLOGEnd ALOGEnd
|
||||
#define YXLOG(level) ALOG_DIY("nim_core_plugin", LogNormal, level)
|
||||
#define YXLOG_API(level) ALOG_DIY("nim_core_plugin", LogApi, level)
|
||||
|
||||
#endif
|
||||
|
||||
#endif // STABLE_H
|
54
windows/src/common/utils/singleton.h
Normal file
54
windows/src/common/utils/singleton.h
Normal file
@ -0,0 +1,54 @@
|
||||
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
|
||||
// Use of this source code is governed by a MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef BASE_SINGLETON_H_
|
||||
#define BASE_SINGLETON_H_
|
||||
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
namespace utils {
|
||||
template <typename T>
|
||||
class Singleton {
|
||||
public:
|
||||
static T* getInstance();
|
||||
|
||||
Singleton(const Singleton& other) = delete;
|
||||
Singleton<T>& operator=(const Singleton& other) = delete;
|
||||
|
||||
private:
|
||||
static std::mutex mutex;
|
||||
static T* instance;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
std::mutex Singleton<T>::mutex;
|
||||
template <typename T>
|
||||
T* Singleton<T>::instance;
|
||||
template <typename T>
|
||||
T* Singleton<T>::getInstance() {
|
||||
if (instance == nullptr) {
|
||||
std::lock_guard<std::mutex> locker(mutex);
|
||||
if (instance == nullptr) {
|
||||
instance = new T();
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
#define SINGLETONG(Class) \
|
||||
private: \
|
||||
friend class utils::Singleton<Class>; \
|
||||
\
|
||||
public: \
|
||||
static Class* getInstance() { return utils::Singleton<Class>::getInstance(); }
|
||||
|
||||
#define HIDE_CONSTRUCTOR(Class) \
|
||||
private: \
|
||||
Class() = default; \
|
||||
Class(const Class& other) = delete; \
|
||||
Class& operator=(const Class& other) = delete; \
|
||||
}
|
||||
|
||||
}
|
||||
#endif // BASE_SINGLETON_H_
|
35
windows/src/common/utils/stringHash.hpp
Normal file
35
windows/src/common/utils/stringHash.hpp
Normal file
@ -0,0 +1,35 @@
|
||||
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
|
||||
// Use of this source code is governed by a MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef BASE_STRINGHASH_H_
|
||||
#define BASE_STRINGHASH_H_
|
||||
|
||||
namespace utils {
|
||||
typedef std::uint64_t hash_t;
|
||||
|
||||
constexpr hash_t prime = 0x100000001B3ull;
|
||||
constexpr hash_t basis = 0xCBF29CE484222325ull;
|
||||
|
||||
inline hash_t hash_(char const* str) {
|
||||
hash_t ret{basis};
|
||||
while (*str) {
|
||||
ret ^= *str;
|
||||
ret *= prime;
|
||||
str++;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
constexpr hash_t hash_compile_time(char const* str, hash_t last_value = basis) {
|
||||
return *str ? hash_compile_time(str + 1, (*str ^ last_value) * prime) : last_value;
|
||||
}
|
||||
|
||||
} // namespace utils
|
||||
|
||||
constexpr unsigned long long operator"" _hash(char const* p, size_t) {
|
||||
return utils::hash_compile_time(p);
|
||||
}
|
||||
|
||||
#endif // BASE_STRINGHASH_H_
|
87
windows/third_party/alog/include/alog.h
vendored
Normal file
87
windows/third_party/alog/include/alog.h
vendored
Normal file
@ -0,0 +1,87 @@
|
||||
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
|
||||
// Use of this source code is governed by a MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef ALOGINSTANCE_H
|
||||
#define ALOGINSTANCE_H
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
#if defined(_WIN32) || defined(WIN32) || defined(_WIN64)
|
||||
#define API_EXPORT
|
||||
#else
|
||||
#ifdef ALOG_API
|
||||
#define API_EXPORT __attribute__((visibility("default")))
|
||||
#else
|
||||
#define API_EXPORT
|
||||
#endif
|
||||
#endif
|
||||
|
||||
typedef enum { Debug = 1, Info, Warn, Error, Fatal } ALogLevel;
|
||||
|
||||
typedef enum {
|
||||
LogNormal = 0, /**< 正常日志打印 */
|
||||
LogApi /**< API接口打印 */
|
||||
} ALogType;
|
||||
|
||||
#define ALOGEnd ALog::ALogEnd()
|
||||
#define ALOG(level) ALog().Init("", __FILE__, __LINE__, LogNormal, level)
|
||||
#define ALOG_DIY(moduleName, type, level) \
|
||||
ALog().Init(moduleName, __FILE__, __LINE__, type, level)
|
||||
|
||||
class API_EXPORT ALog {
|
||||
public:
|
||||
class ALogEnd {};
|
||||
|
||||
public:
|
||||
ALog& Init(const char* module, const char* file, long line, ALogType type,
|
||||
ALogLevel level);
|
||||
ALog& operator<<(int value);
|
||||
ALog& operator<<(unsigned int value);
|
||||
ALog& operator<<(const std::string& value);
|
||||
ALog& operator<<(const char* value);
|
||||
ALog& operator<<(long long value);
|
||||
ALog& operator<<(unsigned long long value);
|
||||
ALog& operator<<(unsigned long value);
|
||||
ALog& operator<<(float value);
|
||||
ALog& operator<<(const unsigned char* value);
|
||||
ALog& operator<<(void* value);
|
||||
template <typename T>
|
||||
ALog& operator<<(T* value) {
|
||||
if (m_level >= m_minLevel) {
|
||||
char strTmp[128] = {0};
|
||||
sprintf(strTmp, "%p", value);
|
||||
m_strLog.append(strTmp);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
void operator<<(const ALog::ALogEnd& value);
|
||||
|
||||
public:
|
||||
static ALog* CreateInstance(const std::string& filePath,
|
||||
const std::string& fileName, ALogLevel minLevel);
|
||||
static ALog* GetInstance();
|
||||
static void DestoryInstance();
|
||||
ALog();
|
||||
~ALog();
|
||||
void setShortFileName(bool shortFileName = false);
|
||||
|
||||
private:
|
||||
explicit ALog(const std::string& file, const std::string& fileName,
|
||||
ALogLevel minLevel);
|
||||
void write();
|
||||
|
||||
private:
|
||||
static std::unique_ptr<ALog> m_log;
|
||||
static ALogLevel m_minLevel;
|
||||
static bool m_shortFileName;
|
||||
std::string m_strLog;
|
||||
std::string m_strModule;
|
||||
std::string m_strFile;
|
||||
long m_line = 0;
|
||||
ALogLevel m_level = Info;
|
||||
ALogType m_type = LogNormal;
|
||||
};
|
||||
|
||||
#endif // ALOGINSTANCE_H
|
14
windows/third_party/alog/include/verinfo.h
vendored
Normal file
14
windows/third_party/alog/include/verinfo.h
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
|
||||
// Use of this source code is governed by a MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef ALog_verinfo_h
|
||||
#define ALog_verinfo_h
|
||||
|
||||
#define ALOG_REVISION "cfe9ad8"
|
||||
#define ALOG_PATH "wjzh/feature/cpp"
|
||||
#define ALOG_URL ""
|
||||
#define ALOG_BUILD_TIME "2021-09-30 13:22:13"
|
||||
#define ALOG_TAG ""
|
||||
|
||||
#endif
|
Loading…
x
Reference in New Issue
Block a user