com.taptap.sdk.cloudsave 4.8.0-beta.1 → 4.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Mobile/Editor/NativeDependencies.xml +8 -2
- package/Mobile/Editor/TapCloudSaveMobileProcessBuild.cs +1 -0
- package/Mobile/Runtime/TapCloudSaveBridge.cs +168 -57
- package/Runtime/Internal/ITapCloudSaveBridge.cs +14 -9
- package/Runtime/Internal/TapCloudSaveInitTask.cs +2 -0
- package/Runtime/Internal/TapTapCloudSaveInternal.cs +22 -29
- package/Runtime/Public/TapTapCloudSave.cs +18 -29
- package/Standalone/Editor/TapCloudSaveStandaloneProcessBuild.cs +26 -0
- package/Standalone/Editor/TapCloudSaveStandaloneProcessBuild.cs.meta +11 -0
- package/Standalone/Editor/TapSDK.CloudSave.Standalone.Editor.asmdef +17 -0
- package/Standalone/Editor/TapSDK.CloudSave.Standalone.Editor.asmdef.meta +7 -0
- package/Standalone/Editor.meta +8 -0
- package/Standalone/Plugins/x86_64/cloudsave_sdk.dll +0 -0
- package/Standalone/Plugins/x86_64/cloudsave_sdk.dll.meta +80 -0
- package/Standalone/Plugins/x86_64.meta +8 -0
- package/Standalone/Plugins.meta +8 -0
- package/Standalone/Runtime/Internal/TapCloudSaveArchiveListResponse.cs +11 -0
- package/Standalone/Runtime/Internal/TapCloudSaveArchiveListResponse.cs.meta +11 -0
- package/Standalone/Runtime/Internal/TapCloudSaveBaseResponse.cs +29 -0
- package/Standalone/Runtime/Internal/TapCloudSaveBaseResponse.cs.meta +11 -0
- package/Standalone/Runtime/Internal/TapCloudSaveTracker.cs +101 -0
- package/Standalone/Runtime/Internal/TapCloudSaveTracker.cs.meta +11 -0
- package/Standalone/Runtime/Internal/TapCloudSaveWrapper.cs +518 -0
- package/Standalone/Runtime/Internal/TapCloudSaveWrapper.cs.meta +11 -0
- package/Standalone/Runtime/Internal.meta +8 -0
- package/Standalone/Runtime/TapCloudSaveResultCode.cs +9 -0
- package/Standalone/Runtime/TapCloudSaveResultCode.cs.meta +11 -0
- package/Standalone/Runtime/TapCloudSaveStandalone.cs +672 -0
- package/Standalone/Runtime/TapCloudSaveStandalone.cs.meta +11 -0
- package/Standalone/Runtime.meta +8 -0
- package/Standalone/TapSDK.CloudSave.Standalone.Runtime.asmdef +22 -0
- package/Standalone/TapSDK.CloudSave.Standalone.Runtime.asmdef.meta +7 -0
- package/Standalone.meta +8 -0
- package/link.xml.meta +1 -1
- package/package.json +10 -10
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
using System;
|
|
2
|
+
using System.Runtime.InteropServices;
|
|
3
|
+
using System.Text;
|
|
4
|
+
|
|
5
|
+
namespace TapSDK.CloudSave.Standalone
|
|
6
|
+
{
|
|
7
|
+
internal class TapCloudSaveWrapper
|
|
8
|
+
{
|
|
9
|
+
#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
|
|
10
|
+
internal const string DllName = "cloudsave_sdk";
|
|
11
|
+
#elif UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX
|
|
12
|
+
internal const string DllName = "libcloudsave_sdk";
|
|
13
|
+
#endif
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* 初始化接口,只需要调用一次。非线程安全,并发调用可能崩溃。
|
|
17
|
+
*
|
|
18
|
+
* cfg 初始化配置,JSON 格式:
|
|
19
|
+
*
|
|
20
|
+
* TapSDK参数格式
|
|
21
|
+
* {
|
|
22
|
+
* "region": 2,
|
|
23
|
+
* "log_to_console": 1,
|
|
24
|
+
* "log_level": 3,
|
|
25
|
+
* "data_dir": "/tmp",
|
|
26
|
+
* "client_id": "***",
|
|
27
|
+
* "client_token": "***",
|
|
28
|
+
* "ua": "TapSDK-Android/3.28.0",
|
|
29
|
+
* "lang": "zh-CN",
|
|
30
|
+
* "platform": "Android",
|
|
31
|
+
* "device_id": "123456",
|
|
32
|
+
* "sdk_artifact": "Android",
|
|
33
|
+
* "sdk_module_ver": "4.6.0",
|
|
34
|
+
* "sdk_token": {
|
|
35
|
+
* "kid": "***",
|
|
36
|
+
* "key": "***"
|
|
37
|
+
* }
|
|
38
|
+
* }
|
|
39
|
+
*
|
|
40
|
+
*
|
|
41
|
+
* - region 取值:0 国内、1 海外、2 RND、3 海外RND
|
|
42
|
+
* - log_to_console 是否输出到控制台:0 不输出、1 输出。
|
|
43
|
+
* - log_level 取值:1 Trace、2 Debug、3 Info、4 Warn、5 Error、6 完全不输出
|
|
44
|
+
* - data_dir 保存本地缓存和日志文件的目录,不允许为空
|
|
45
|
+
* - client_id 不允许为空
|
|
46
|
+
* - client_token 不允许为空
|
|
47
|
+
* - ua user agent,不允许为空
|
|
48
|
+
* - lang 语言,允许为空
|
|
49
|
+
* - platform 不允许为空,TapSDK专用参数
|
|
50
|
+
* - device_id 设备ID,不允许为空,TapSDK专用参数
|
|
51
|
+
* - sdk_artifact 不允许为空,TapSDK专用参数
|
|
52
|
+
* - sdk_module_ver 不允许为空,TapSDK专用参数
|
|
53
|
+
* - sdk_token 登录态鉴权token,允许为空,TapSDK专用参数
|
|
54
|
+
* - kid mac_key id,不允许为空
|
|
55
|
+
* - key mac密钥,不允许为空
|
|
56
|
+
* - runtime_ver 宿主版本,不允许为空,Tap Miniapp专用参数
|
|
57
|
+
* - access_token 登录态鉴权token,允许为空,Tap Miniapp专用参数
|
|
58
|
+
* - kid mac_key id,不允许为空
|
|
59
|
+
* - key mac密钥,不允许为空
|
|
60
|
+
*
|
|
61
|
+
* 成功返回 0,失败返回 -1
|
|
62
|
+
*/
|
|
63
|
+
[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
|
|
64
|
+
internal static extern int TapSdkCloudSaveInitialize(string cfg);
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* 用于释放TapSdkCloudSaveCreateArchive、TapSdkCloudSaveGetArchiveList、TapSdkCloudSaveGetArchiveData等函数返回的堆内存
|
|
68
|
+
*
|
|
69
|
+
* @param data 需要释放的内存
|
|
70
|
+
*/
|
|
71
|
+
[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
|
|
72
|
+
internal static extern void TapSdkCloudSaveFreeMemory(IntPtr intPtr);
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* access token发生变化(比如切换账号)时调用。收到接口报access_denied错误时,SDK使用方需要重新登录,然后调用该接口更新access token
|
|
76
|
+
*
|
|
77
|
+
* @param token 最新的access token,传空指针或"{}"表示用户退出登录。格式如下:
|
|
78
|
+
* {
|
|
79
|
+
* "kid": "***",
|
|
80
|
+
* "key": "***"
|
|
81
|
+
* }
|
|
82
|
+
*
|
|
83
|
+
* @return 成功返回 0,失败(通常是JSON格式错误)返回 -1
|
|
84
|
+
*/
|
|
85
|
+
[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
|
|
86
|
+
internal static extern int TapSdkCloudSaveUpdateAccessToken(string token);
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* 创建云存档,同步等待服务端返回,然后更新本地存档缓存。不允许并发调用,否则直接抛错
|
|
90
|
+
*
|
|
91
|
+
* @param metadata 存档元信息,JSON格式
|
|
92
|
+
* {
|
|
93
|
+
* "name": "存档名,60字节以内,不允许空,不允许汉字",
|
|
94
|
+
* "summary": "存档描述,500字节以内,不允许空",
|
|
95
|
+
* "extra": "用户自定义信息,1000字节以内,允许空",
|
|
96
|
+
* "playtime": 0
|
|
97
|
+
* }
|
|
98
|
+
* - playtime 秒级
|
|
99
|
+
* @param archiveData 存档二进制数据,不允许空指针
|
|
100
|
+
* @param archiveDataSize saveData的大小(字节),不允许为0
|
|
101
|
+
* @param coverData 封面二进制数据,允许空指针
|
|
102
|
+
* @param coverDataSize saveData的大小(字节),允许为0
|
|
103
|
+
* @param extraParams Tap Miniapp专用参数,JSON格式。其他接入方传空指针即可
|
|
104
|
+
* {
|
|
105
|
+
* "X-UA": "***",
|
|
106
|
+
* "miniappId": "***"
|
|
107
|
+
* }
|
|
108
|
+
*
|
|
109
|
+
* @return JSON格式,服务端生成的云存档UUID和FileID,或者错误信息。用完后,调用方需要调用TapSdkCloudSaveFreeMemory来释放内存
|
|
110
|
+
* {
|
|
111
|
+
* "data": {
|
|
112
|
+
* "uuid": "存档UUID",
|
|
113
|
+
* "file_id": "存档文件ID,用于下载文件"
|
|
114
|
+
* },
|
|
115
|
+
* "now": 1748340775,
|
|
116
|
+
* "success": true
|
|
117
|
+
* }
|
|
118
|
+
* @note 对于Tap Miniapp,JSON字段使用驼峰风格。比如上面的返回示例,对于Tap Miniapp,是"fileId"而不是"file_id"。
|
|
119
|
+
*/
|
|
120
|
+
[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
|
|
121
|
+
internal static extern IntPtr TapSdkCloudSaveCreateArchive(
|
|
122
|
+
string metadata,
|
|
123
|
+
byte[] archiveData,
|
|
124
|
+
int archiveDataSize,
|
|
125
|
+
byte[] coverData,
|
|
126
|
+
int coverDataSize,
|
|
127
|
+
string extraParams
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* 更新云存档,同步等待服务端返回,然后更新本地存档缓存。不允许并发调用,否则直接抛错
|
|
132
|
+
*
|
|
133
|
+
* @param archiveUUID TapSdkCloudSaveCreateArchive()返回的云存档UUID,比如:"1bffaa173dde2e7afb5adf6442971961"。必须先创建云存档成功后,通过云存档UUID来更新
|
|
134
|
+
* @param metadata 存档元信息,JSON格式
|
|
135
|
+
* {
|
|
136
|
+
* "name": "存档名,60字节以内,不允许空,不允许汉字",
|
|
137
|
+
* "summary": "存档描述,500字节以内,不允许空",
|
|
138
|
+
* "extra": "用户自定义信息,1000字节以内,允许空",
|
|
139
|
+
* "playtime": 0
|
|
140
|
+
* }
|
|
141
|
+
* - playtime 秒级
|
|
142
|
+
* @param archiveData 存档二进制数据,不允许空指针
|
|
143
|
+
* @param archiveDataSize saveData的大小(字节),不允许为0
|
|
144
|
+
* @param coverData 封面二进制数据,允许空指针
|
|
145
|
+
* @param coverDataSize saveData的大小(字节),允许为0
|
|
146
|
+
* @param extraParams Tap Miniapp专用参数,JSON格式。其他接入方传空指针即可
|
|
147
|
+
* {
|
|
148
|
+
* "X-UA": "***",
|
|
149
|
+
* "miniappId": "***"
|
|
150
|
+
* }
|
|
151
|
+
*
|
|
152
|
+
* @return JSON格式,服务端生成的云存档UUID和FileID,或者错误信息。用完后,调用方需要调用TapSdkCloudSaveFreeMemory来释放内存
|
|
153
|
+
* {
|
|
154
|
+
* "data": {
|
|
155
|
+
* "uuid": "存档UUID",
|
|
156
|
+
* "file_id": "存档文件ID,用于下载文件"
|
|
157
|
+
* },
|
|
158
|
+
* "now": 1748340775,
|
|
159
|
+
* "success": true
|
|
160
|
+
* }
|
|
161
|
+
* @note 对于Tap Miniapp,JSON字段使用驼峰风格。比如上面的返回示例,对于Tap Miniapp,是"fileId"而不是"file_id"。
|
|
162
|
+
*/
|
|
163
|
+
[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
|
|
164
|
+
internal static extern IntPtr TapSdkCloudSaveUpdateArchive(
|
|
165
|
+
string archiveUUID,
|
|
166
|
+
string metadata,
|
|
167
|
+
byte[] archiveData,
|
|
168
|
+
int archiveDataSize,
|
|
169
|
+
byte[] coverData,
|
|
170
|
+
int coverDataSize,
|
|
171
|
+
string extraParams
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* 发起删除存档请求,同步等待服务端返回,然后删除本地存档缓存。允许并发调用
|
|
176
|
+
*
|
|
177
|
+
* @param archiveUUID TapSdkCloudSaveCreateArchive()/TapSdkCloudSaveGetArchiveList()返回的云存档UUID,比如:"1bffaa173dde2e7afb5adf6442971961"。必须先创建云存档成功后,通过云存档UUID来删除
|
|
178
|
+
* @param extraParams Tap Miniapp专用参数,JSON格式。其他接入方传空指针即可
|
|
179
|
+
* {
|
|
180
|
+
* "X-UA": "***",
|
|
181
|
+
* "miniappId": "***"
|
|
182
|
+
* }
|
|
183
|
+
*
|
|
184
|
+
* @return JSON格式,返回成功或者错误信息。用完后,调用方需要调用TapSdkCloudSaveFreeMemory来释放内存
|
|
185
|
+
* {
|
|
186
|
+
* "data": {
|
|
187
|
+
* "uuid": "被删掉的云存档UUID"
|
|
188
|
+
* },
|
|
189
|
+
* "now": 1748487810,
|
|
190
|
+
* "success": true
|
|
191
|
+
* }
|
|
192
|
+
*/
|
|
193
|
+
[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
|
|
194
|
+
internal static extern IntPtr TapSdkCloudSaveDeleteArchive(
|
|
195
|
+
string archiveUUID,
|
|
196
|
+
string extraParams
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* 获取存档元信息列表,同步等待服务端返回。允许并发调用
|
|
201
|
+
*
|
|
202
|
+
* @param extraParams Tap Miniapp专用参数,JSON格式。其他接入方传空指针即可
|
|
203
|
+
* {
|
|
204
|
+
* "X-UA": "***",
|
|
205
|
+
* "miniappId": "***"
|
|
206
|
+
* }
|
|
207
|
+
*
|
|
208
|
+
* @return JSON格式,返回存档元信息列表,或者错误信息。用完后,需要调用TapSdkCloudSaveFreeMemory来释放内存
|
|
209
|
+
* {
|
|
210
|
+
* "data": {
|
|
211
|
+
* "saves": [
|
|
212
|
+
* {
|
|
213
|
+
* "uuid": "738b6c08bdbe459b96607dd10f83d177",
|
|
214
|
+
* "file_id": "738b6c08bdbe459b96607dd10f83d177",
|
|
215
|
+
* "name": "save",
|
|
216
|
+
* "save_size": 184237,
|
|
217
|
+
* "cover_size": 7138,
|
|
218
|
+
* "summary": "i love this game",
|
|
219
|
+
* "extra": "what the hell",
|
|
220
|
+
* "playtime": 0,
|
|
221
|
+
* "created_time": 1748587677,
|
|
222
|
+
* "modified_time": 1748587677
|
|
223
|
+
* }
|
|
224
|
+
* ]
|
|
225
|
+
* },
|
|
226
|
+
* "now": 1748588091,
|
|
227
|
+
* "success": true
|
|
228
|
+
* }
|
|
229
|
+
* - playtime 秒级
|
|
230
|
+
* @note 对于Tap Miniapp,JSON字段使用驼峰风格。比如上面的返回示例,对于Tap Miniapp,是"fileId/saveSize"而不是"file_id/save_size"。
|
|
231
|
+
*/
|
|
232
|
+
[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
|
|
233
|
+
internal static extern IntPtr TapSdkCloudSaveGetArchiveList(string extraParams);
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* 读取存档文件,优先使用本地缓存,不存在才下载
|
|
237
|
+
*
|
|
238
|
+
* @param archiveUUID TapSdkCloudSaveCreateArchive()/TapSdkCloudSaveGetArchiveList()返回的云存档UUID,必须先创建云存档成功后,才能读取
|
|
239
|
+
* @param archiveFileID TapSdkCloudSaveCreateArchive()/TapSdkCloudSaveGetArchiveList()返回的存档文件FileID,必须先创建云存档成功后,才能读取
|
|
240
|
+
* @param archiveDataSize 出参,实际读取到的存档文件大小。如果读取失败,则其值会是负数
|
|
241
|
+
* @param extraParams Tap Miniapp专用参数,JSON格式。其他接入方传空指针即可
|
|
242
|
+
* {
|
|
243
|
+
* "X-UA": "***",
|
|
244
|
+
* "miniappId": "***"
|
|
245
|
+
* }
|
|
246
|
+
*
|
|
247
|
+
* @return 成功时saveSize是实际读取到的存档文件大小,返回存档文件内容;失败时saveSize是负数,返回JSON格式的错误信息,格式如下。用完后,需要调用TapSdkCloudSaveFreeMemory来释放内存
|
|
248
|
+
* {
|
|
249
|
+
* "data": {
|
|
250
|
+
* "code": -1,
|
|
251
|
+
* "msg": "InvalidArgument: BINDING: Key: 'GetSavesRequest.uuid' Error:Field validation for 'uuid' failed on the 'len' tag",
|
|
252
|
+
* "error": "invalid_request",
|
|
253
|
+
* "error_description": "InvalidArgument: BINDING: Key: 'GetSavesRequest.uuid' Error:Field validation for 'uuid' failed on the 'len' tag"
|
|
254
|
+
* },
|
|
255
|
+
* "now": 1748915185,
|
|
256
|
+
* "success": false
|
|
257
|
+
* }
|
|
258
|
+
* @note 对于Tap Miniapp,JSON字段使用驼峰风格。比如上面的返回示例,对于Tap Miniapp,是"errorDescription"而不是"error_description"。
|
|
259
|
+
*/
|
|
260
|
+
[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
|
|
261
|
+
internal static extern IntPtr TapSdkCloudSaveGetArchiveData(
|
|
262
|
+
string archiveUUID,
|
|
263
|
+
string archiveFileID,
|
|
264
|
+
out int archiveDataSize,
|
|
265
|
+
string extraParams
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* 读取封面文件,优先使用本地缓存,不存在才下载
|
|
270
|
+
*
|
|
271
|
+
* @param archiveUUID TapSdkCloudSaveCreateArchive()/TapSdkCloudSaveGetArchiveList()返回的云存档UUID,必须先创建云存档成功后,才能读取
|
|
272
|
+
* @param archiveFileID TapSdkCloudSaveCreateArchive()/TapSdkCloudSaveGetArchiveList()返回的存档文件FileID,必须先创建云存档成功后,才能读取
|
|
273
|
+
* @param coverSize 出参,实际读取到的封面文件大小。如果读取失败,则其值会是负数
|
|
274
|
+
* @param extraParams Tap Miniapp专用参数,JSON格式。其他接入方传空指针即可
|
|
275
|
+
* {
|
|
276
|
+
* "X-UA": "***",
|
|
277
|
+
* "miniappId": "***"
|
|
278
|
+
* }
|
|
279
|
+
*
|
|
280
|
+
* @return 成功时coverSize是实际读取到的封面文件大小,返回cover文件内容;失败时coverSize是负数,返回JSON格式的错误信息,格式如下。用完后,需要调用TapSdkCloudSaveFreeMemory来释放内存
|
|
281
|
+
* {
|
|
282
|
+
* "data": {
|
|
283
|
+
* "code": -1,
|
|
284
|
+
* "msg": "InvalidArgument: BINDING: Key: 'GetSavesRequest.uuid' Error:Field validation for 'uuid' failed on the 'len' tag",
|
|
285
|
+
* "error": "invalid_request",
|
|
286
|
+
* "error_description": "InvalidArgument: BINDING: Key: 'GetSavesRequest.uuid' Error:Field validation for 'uuid' failed on the 'len' tag"
|
|
287
|
+
* },
|
|
288
|
+
* "now": 1748915185,
|
|
289
|
+
* "success": false
|
|
290
|
+
* }
|
|
291
|
+
* @note 对于Tap Miniapp,JSON字段使用驼峰风格。比如上面的返回示例,对于Tap Miniapp,是"errorDescription"而不是"error_description"。
|
|
292
|
+
*/
|
|
293
|
+
[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
|
|
294
|
+
internal static extern IntPtr TapSdkCloudSaveGetArchiveCover(
|
|
295
|
+
string archiveUUID,
|
|
296
|
+
string archiveFileID,
|
|
297
|
+
out int coverSize,
|
|
298
|
+
string extraParams
|
|
299
|
+
);
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* 设置日志等级
|
|
303
|
+
* - logLevel 日志等级:1 trace、2 debug、3 info、4 warn、5 error、> 5 不打日志。建议调试时设为1,正式版设为3。
|
|
304
|
+
* - logToConsole 是否输出到控制台:0 不输出、1 输出。
|
|
305
|
+
*/
|
|
306
|
+
[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
|
|
307
|
+
internal static extern void TapSdkCloudSaveSetLogLevel(int logLevel, int logToConsole);
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* 代码版本,如:1.2.5
|
|
311
|
+
*
|
|
312
|
+
* @return SDK版本号,全局静态变量,无需释放内存
|
|
313
|
+
*/
|
|
314
|
+
[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
|
|
315
|
+
internal static extern IntPtr TapSdkCloudSaveVersion();
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* git commit 版本,如:98f5d81a0fdcab9a755878b3e825c2cb510e5196
|
|
319
|
+
*
|
|
320
|
+
* @return git commit版本,全局静态变量,无需释放内存
|
|
321
|
+
*/
|
|
322
|
+
[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
|
|
323
|
+
internal static extern IntPtr TapSdkCloudSaveGitCommit();
|
|
324
|
+
|
|
325
|
+
internal static string CreateArchive(
|
|
326
|
+
string metadata,
|
|
327
|
+
byte[] archiveData,
|
|
328
|
+
int archiveDataSize,
|
|
329
|
+
byte[] coverData,
|
|
330
|
+
int coverDataSize
|
|
331
|
+
)
|
|
332
|
+
{
|
|
333
|
+
IntPtr intPtr = TapSdkCloudSaveCreateArchive(
|
|
334
|
+
metadata,
|
|
335
|
+
archiveData,
|
|
336
|
+
archiveDataSize,
|
|
337
|
+
coverData,
|
|
338
|
+
coverDataSize,
|
|
339
|
+
null
|
|
340
|
+
);
|
|
341
|
+
try
|
|
342
|
+
{
|
|
343
|
+
string result = GetUTF8String(intPtr);
|
|
344
|
+
return result;
|
|
345
|
+
}
|
|
346
|
+
finally
|
|
347
|
+
{
|
|
348
|
+
TapSdkCloudSaveFreeMemory(intPtr);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
internal static string UpdateArchive(
|
|
353
|
+
string archiveUUID,
|
|
354
|
+
string metadata,
|
|
355
|
+
byte[] archiveData,
|
|
356
|
+
int archiveDataSize,
|
|
357
|
+
byte[] coverData,
|
|
358
|
+
int coverDataSize
|
|
359
|
+
)
|
|
360
|
+
{
|
|
361
|
+
IntPtr intPtr = TapSdkCloudSaveUpdateArchive(
|
|
362
|
+
archiveUUID,
|
|
363
|
+
metadata,
|
|
364
|
+
archiveData,
|
|
365
|
+
archiveDataSize,
|
|
366
|
+
coverData,
|
|
367
|
+
coverDataSize,
|
|
368
|
+
null
|
|
369
|
+
);
|
|
370
|
+
try
|
|
371
|
+
{
|
|
372
|
+
string result = GetUTF8String(intPtr);
|
|
373
|
+
return result;
|
|
374
|
+
}
|
|
375
|
+
finally
|
|
376
|
+
{
|
|
377
|
+
TapSdkCloudSaveFreeMemory(intPtr);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
internal static string DeleteArchive(string archiveUUID)
|
|
382
|
+
{
|
|
383
|
+
IntPtr intPtr = TapSdkCloudSaveDeleteArchive(archiveUUID, null);
|
|
384
|
+
try
|
|
385
|
+
{
|
|
386
|
+
string result = GetUTF8String(intPtr);
|
|
387
|
+
return result;
|
|
388
|
+
}
|
|
389
|
+
finally
|
|
390
|
+
{
|
|
391
|
+
TapSdkCloudSaveFreeMemory(intPtr);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
internal static string GetArchiveList()
|
|
396
|
+
{
|
|
397
|
+
IntPtr intPtr = TapSdkCloudSaveGetArchiveList(null);
|
|
398
|
+
try
|
|
399
|
+
{
|
|
400
|
+
string result = GetUTF8String(intPtr);
|
|
401
|
+
return result;
|
|
402
|
+
}
|
|
403
|
+
finally
|
|
404
|
+
{
|
|
405
|
+
TapSdkCloudSaveFreeMemory(intPtr);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
internal static byte[] GetArchiveData(
|
|
410
|
+
string archiveUUID,
|
|
411
|
+
string archiveFileID,
|
|
412
|
+
out int archiveDataSize
|
|
413
|
+
)
|
|
414
|
+
{
|
|
415
|
+
int dataSize = 0;
|
|
416
|
+
IntPtr intPtr = TapSdkCloudSaveGetArchiveData(
|
|
417
|
+
archiveUUID,
|
|
418
|
+
archiveFileID,
|
|
419
|
+
out dataSize,
|
|
420
|
+
null
|
|
421
|
+
);
|
|
422
|
+
try
|
|
423
|
+
{
|
|
424
|
+
byte[] result;
|
|
425
|
+
if (dataSize >= 0)
|
|
426
|
+
{
|
|
427
|
+
if (dataSize == 0)
|
|
428
|
+
{
|
|
429
|
+
result = new byte[0];
|
|
430
|
+
}
|
|
431
|
+
else
|
|
432
|
+
{
|
|
433
|
+
result = GetOriginByte(intPtr, dataSize);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
else
|
|
437
|
+
{
|
|
438
|
+
result = GetUTF8Byte(intPtr);
|
|
439
|
+
}
|
|
440
|
+
archiveDataSize = dataSize;
|
|
441
|
+
return result;
|
|
442
|
+
}
|
|
443
|
+
finally
|
|
444
|
+
{
|
|
445
|
+
TapSdkCloudSaveFreeMemory(intPtr);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
internal static byte[] GetArchiveCover(
|
|
450
|
+
string archiveUUID,
|
|
451
|
+
string archiveFileID,
|
|
452
|
+
out int coverSize
|
|
453
|
+
)
|
|
454
|
+
{
|
|
455
|
+
int dataSize;
|
|
456
|
+
byte[] result;
|
|
457
|
+
IntPtr intPtr = TapSdkCloudSaveGetArchiveCover(
|
|
458
|
+
archiveUUID,
|
|
459
|
+
archiveFileID,
|
|
460
|
+
out dataSize,
|
|
461
|
+
null
|
|
462
|
+
);
|
|
463
|
+
try
|
|
464
|
+
{
|
|
465
|
+
coverSize = dataSize;
|
|
466
|
+
if (dataSize >= 0)
|
|
467
|
+
{
|
|
468
|
+
if (dataSize == 0)
|
|
469
|
+
{
|
|
470
|
+
result = new byte[0];
|
|
471
|
+
}
|
|
472
|
+
else
|
|
473
|
+
{
|
|
474
|
+
result = GetOriginByte(intPtr, dataSize);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
else
|
|
478
|
+
{
|
|
479
|
+
result = GetUTF8Byte(intPtr);
|
|
480
|
+
}
|
|
481
|
+
return result;
|
|
482
|
+
}
|
|
483
|
+
finally
|
|
484
|
+
{
|
|
485
|
+
TapSdkCloudSaveFreeMemory(intPtr);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
private static string GetUTF8String(IntPtr ptr)
|
|
490
|
+
{
|
|
491
|
+
byte[] buffer = GetUTF8Byte(ptr);
|
|
492
|
+
// 3. 按 UTF-8 解码
|
|
493
|
+
return Encoding.UTF8.GetString(buffer);
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
private static byte[] GetUTF8Byte(IntPtr ptr)
|
|
497
|
+
{
|
|
498
|
+
// 1. 获取字符串长度(假设以 null 结尾)
|
|
499
|
+
int len = 0;
|
|
500
|
+
while (Marshal.ReadByte(ptr, len) != 0)
|
|
501
|
+
{
|
|
502
|
+
len++;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
// 2. 复制字节到托管数组
|
|
506
|
+
byte[] buffer = new byte[len];
|
|
507
|
+
Marshal.Copy(ptr, buffer, 0, len);
|
|
508
|
+
return buffer;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
private static byte[] GetOriginByte(IntPtr ptr, int length)
|
|
512
|
+
{
|
|
513
|
+
byte[] copyByte = new byte[length];
|
|
514
|
+
Marshal.Copy(ptr, copyByte, 0, length);
|
|
515
|
+
return copyByte;
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|