Toggle navigation
Toggle navigation
此项目
正在载入...
Sign in
李勇
/
McuClient
转到一个项目
Toggle navigation
项目
群组
代码片段
帮助
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
李勇
2017-02-08 10:13:48 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
f69cfbf15da89e56c1a8cab93d0736497fe1e1aa
f69cfbf1
1 parent
5b4378e9
1.增加文档模块的对外接口,整理了文档的pdu结构
2.调整白板模块的pdu结构,和文档模块关联
显示空白字符变更
内嵌
并排对比
正在显示
10 个修改的文件
包含
271 行增加
和
25 行删除
dist/McuClient.js
src/EngineEntrance.js
src/EngineUtils.js
src/MessageTypes.js
src/apes/ConferApe.js
src/apes/DocApe.js
src/apes/VideoApe.js
src/apes/WhiteBoardApe.js
src/mcu.js
src/pdus/pro.js
dist/McuClient.js
已删除
100644 → 0
查看文件 @
5b4378e
此 diff 太大无法显示。
src/EngineEntrance.js
查看文件 @
f69cfbf
...
...
@@ -102,12 +102,22 @@ export default class MessageEntrance extends Emiter {
//videoApe
this
.
getPlayVideoPath
=
this
.
_getPlayVideoPath
;
this
.
getPublishVideoPath
=
this
.
_getPublishVideoPath
;
this
.
publishVideo
=
this
.
_publishVideo
;
this
.
stopPublishVideo
=
this
.
_stopPublishVideo
;
//whiteBoradApe
this
.
sendInsertAnnotaion
=
this
.
_sendInsertAnnotaion
;
//this.sendUpdaterAnnotaion=this._sendUpdaterAnnotaion;//暂时关闭更新接口
this
.
sendDeleteAnnotaion
=
this
.
_sendDeleteAnnotaion
;
this
.
sendDeleteAllAnnotation
=
this
.
_sendDeleteAllAnnotation
;
//DocApe
this
.
sendDocumentUpload
=
this
.
_sendDocumentUpload
;
//上传文档
this
.
sendDocumentSwitch
=
this
.
_sendDocumentSwitch
;
//切换文档
this
.
sendDocumentDelete
=
this
.
_sendDocumentDelete
;
//删除文档
this
.
sendDocumentCommand
=
this
.
_sendDocumentCommand
;
//操作文档(翻页、缩放、滚动...)
//debug
//this.setDebugData=this._setDebugData;
}
...
...
@@ -295,19 +305,26 @@ export default class MessageEntrance extends Emiter {
_getPlayVideoPath
(
_param
){
if
(
_video_ape
){
return
_video_ape
.
getPlayVideoPath
(
_param
);
}
else
{
return
{
"code"
:
1
,
"data"
:
"获取播放地址失败"
};
}
}
_getPublishVideoPath
(
_param
){
if
(
_video_ape
){
return
_video_ape
.
getPublishVideoPath
(
_param
);
}
else
{
return
{
"code"
:
1
,
"data"
:
"获取推流地址失败"
};
}
}
_publishVideo
(
_param
){
if
(
_video_ape
){
return
_video_ape
.
publishVideo
(
_param
);
}
}
_stopPublishVideo
(
_param
){
if
(
_video_ape
){
return
_video_ape
.
stopPublishVideo
(
_param
);
}
}
//WhiteBoardApe
// 添加标注,发送信息
...
...
@@ -335,6 +352,32 @@ export default class MessageEntrance extends Emiter {
}
}
//DocApe
//上传文档
_sendDocumentUpload
(
_param
){
if
(
_doc_ape
){
_doc_ape
.
documentUpload
(
_param
);
}
}
//切换文档
_sendDocumentSwitch
(
_param
){
if
(
_doc_ape
){
_doc_ape
.
documentSwitch
(
_param
);
}
}
//删除文档
_sendDocumentDelete
(
_param
){
if
(
_doc_ape
){
_doc_ape
.
documentDelete
(
_param
);
}
}
//操作文档(翻页、缩放、滚动...)
_sendDocumentCommand
(
_param
){
if
(
_doc_ape
){
_doc_ape
.
documentCommand
(
_param
);
}
}
// 白板笔记更新(svg)
annoUpdateHandler
(
annoInfo
)
{
const
activeDocId
=
_confer_ape
.
activeDocId
;
...
...
src/EngineUtils.js
查看文件 @
f69cfbf
...
...
@@ -25,5 +25,12 @@ class EngineUtils{
}
return
null
;
}
//生成nodeId的随机数
static
generateNodeID
(){
let
time
=
new
Date
().
getTime
();
let
nodeID
:
int
=
time
%
1000000000
;
//time后9位
return
nodeID
;
}
}
export
default
EngineUtils
;
\ No newline at end of file
...
...
src/MessageTypes.js
查看文件 @
f69cfbf
...
...
@@ -37,6 +37,7 @@ MessageTypes.CHAT_RECEIVE = 'chat.receive';
//视频模块事件定义
MessageTypes
.
VIDEO_RECEIVE
=
'video.receive'
;
//文档模块事件定义
MessageTypes
.
DOC_SHOW
=
'document.show'
;
MessageTypes
.
DOC_UPLOAD
=
'document.upload'
;
//上传文档
...
...
src/apes/ConferApe.js
查看文件 @
f69cfbf
...
...
@@ -54,6 +54,7 @@ class ConferApe extends Ape {
ApeConsts
.
CONFERENCE_OBJ_COUNTER_NAME
,
ApeConsts
.
CONFERENCE_OBJ_COUNTER_TAG
,
0
,
new
ArrayBuffer
);
this
.
on
(
pdu
.
RCPDU_SESSION_JOIN_RESPONSE
,
this
.
_joinSessionHandler
.
bind
(
this
));
}
_joinSessionHandler
(
confInfo
)
{
...
...
@@ -155,7 +156,6 @@ class ConferApe extends Ape {
//更新人员列表数据
rosterUpdateHandler
(
nodeId
,
nodeData
)
{
//loger.log("更新人员列表数据 rosterUpdateHandler");
if
(
nodeData
.
role
===
ApeConsts
.
NR_MASTER
||
nodeData
.
role
===
ApeConsts
.
NR_SLAVE
)
{
...
...
src/apes/DocApe.js
查看文件 @
f69cfbf
...
...
@@ -18,9 +18,11 @@ import ApeConsts from './ApeConsts';
import
pdu
from
'pdus'
;
import
Loger
from
'Loger'
;
import
MessageTypes
from
'MessageTypes'
;
import
GlobalConfig
from
'GlobalConfig'
;
import
EngineUtils
from
'EngineUtils'
;
let
loger
=
Loger
.
getLoger
(
'DocApe'
);
let
itemIdx
=
0
;
//table插入新数据的计数id,目前用时间戳
class
DocApe
extends
Ape
{
constructor
()
{
super
(
...
...
@@ -38,21 +40,176 @@ class DocApe extends Ape {
// 延迟
this
.
_apeDelayed
=
true
;
}
/////////////发送数据操作//////////////////////////////////////////////////////
//上传文档
documentUpload
(
paramInfo
){
if
(
paramInfo
==
null
||
EngineUtils
.
isEmptyObject
(
paramInfo
)){
loger
.
log
(
'documentUpload失败,参数错误'
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_APE_INTERFACE_PARAM_WRONG
);
return
;
}
itemIdx
=
parseInt
(
Date
.
now
()
/
1000
);
let
docDataModelPdu
=
this
.
packPdu
(
paramInfo
,
itemIdx
);
if
(
docDataModelPdu
==
null
){
loger
.
log
(
'documentUpload失败,参数错误'
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_APE_INTERFACE_PARAM_WRONG
);
return
;
}
console
.
log
(
docDataModelPdu
);
let
tableItemPdu
=
new
pdu
[
'RCRegistryTableItemPdu'
];
tableItemPdu
.
itemIdx
=
itemIdx
;
//直接用时间戳作为id
tableItemPdu
.
registerObjId
=
ApeConsts
.
DOCSHARING_OBJ_TABLE_ID_H5
;
tableItemPdu
.
owner
=
0
;
//收到flash的是这个值,不清楚先写固定
tableItemPdu
.
itemData
=
docDataModelPdu
.
toArrayBuffer
();
//insert
let
tableInsertItemPdu
=
new
pdu
[
'RCRegistryTableInsertItemPdu'
];
//optional RCPduType_E type = 1 [default = RCPDU_REG_TABLE_UPDATE_PDU];
//repeated RCRegistryTableItemPdu items = 2;
tableInsertItemPdu
.
type
=
pdu
.
RCPDU_REG_TABLE_INSERT_PDU
;
//
tableInsertItemPdu
.
items
.
push
(
tableItemPdu
);
let
updateObjPdu
=
new
pdu
[
'RCRegistryUpdateObjPdu'
];
updateObjPdu
.
objId
=
ApeConsts
.
DOCSHARING_OBJ_TABLE_ID_H5
;
updateObjPdu
.
subType
=
tableInsertItemPdu
.
type
;
updateObjPdu
.
userData
=
tableInsertItemPdu
.
toArrayBuffer
();
//同步
let
adapterItemPdu
=
new
pdu
[
'RCAdapterItemPdu'
];
adapterItemPdu
.
type
=
pdu
.
RCPDU_REG_UPDATE_OBJ
;
adapterItemPdu
.
itemData
=
updateObjPdu
.
toArrayBuffer
();
let
adapterPdu
=
new
pdu
[
'RCAdapterPdu'
];
adapterPdu
.
type
=
pdu
.
RCPDU_REG_ADAPTER
;
adapterPdu
.
item
.
push
(
adapterItemPdu
);
console
.
log
(
"文档upload tableItemPdu.itemIdx="
+
tableItemPdu
.
itemIdx
);
this
.
sendUniform
(
adapterPdu
,
true
);
}
//切换文档
documentSwitch
(
paramInfo
){
}
//操作文档(翻页、缩放、滚动...)
documentCommand
(
paramInfo
){
}
//删除文档
documentDelete
(
paramInfo
){
//{"itemIdx":itemIdx}
let
tableDeleteItemPdu
=
new
pdu
[
'RCRegistryTableDeleteItemPdu'
];
//optional RCPduType_E type = 1 [default = RCPDU_REG_TABLE_DELETE_PDU];
// repeated uint32 item_idx = 2;
tableDeleteItemPdu
.
type
=
pdu
.
RCPDU_REG_TABLE_DELETE_PDU
;
//
tableDeleteItemPdu
.
itemIdx
=
parseInt
(
paramInfo
.
itemIdx
);
//这里需要设置要删除的数据的itemIdx,每条数据的这个id都不一样
let
updateObjPdu
=
new
pdu
[
'RCRegistryUpdateObjPdu'
];
updateObjPdu
.
objId
=
ApeConsts
.
DOCSHARING_OBJ_TABLE_ID_H5
;
updateObjPdu
.
subType
=
tableDeleteItemPdu
.
type
;
updateObjPdu
.
userData
=
tableDeleteItemPdu
.
toArrayBuffer
();
//同步
let
adapterItemPdu
=
new
pdu
[
'RCAdapterItemPdu'
];
adapterItemPdu
.
type
=
pdu
.
RCPDU_REG_UPDATE_OBJ
;
adapterItemPdu
.
itemData
=
updateObjPdu
.
toArrayBuffer
();
let
adapterPdu
=
new
pdu
[
'RCAdapterPdu'
];
adapterPdu
.
type
=
pdu
.
RCPDU_REG_ADAPTER
;
adapterPdu
.
item
.
push
(
adapterItemPdu
);
console
.
log
(
"文档发送删除数据============="
+
tableDeleteItemPdu
.
itemIdx
);
this
.
sendUniform
(
adapterPdu
,
true
);
}
///////白板数据的封包和解包/////////////////////////////////////////
packPdu
(
_param
,
_itemIdx
){
//验证坐标点集合数组是否合法
if
(
_param
.
pointGroup
==
null
||
_param
.
pointGroup
.
length
<
1
){
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_APE_INTERFACE_PARAM_WRONG
);
return
null
;
}
/* required uint32 item_idx=1;//唯一标识
required uint32 owner=2;
optional uint32 from=3;
optional uint32 cur_page_no=4;
optional uint32 page_num =5;
required string filetype=6;
required string doc_type=7;
required string relative_url=8;//文档相对地址
optional string url =9;//文档地址
optional uint32 cur_V=10;
optional uint32 cur_H=11;
optional uint32 scale=12;
optional bool visible=13;
optional uint32 action=14;//0,无操作, 1翻页、2.显示/隐藏
optional string id=15;//文档在服务器数据库中的唯一id*/
//判断type类型,根据type设置不同的参数
let
docModelPdu
=
new
pdu
[
'RCDocSendDataModel'
];
docModelPdu
.
itemIdx
=
_itemIdx
;
docModelPdu
.
owner
=
GlobalConfig
.
nodeId
;
docModelPdu
.
from
=
GlobalConfig
.
nodeId
;
docModelPdu
.
curPageNo
=
1
;
docModelPdu
.
pageNum
=
10
;
docModelPdu
.
fileType
=
_param
.
fileType
||
""
;
docModelPdu
.
docType
=
"pdf2swf"
;
docModelPdu
.
url
=
"http://101.200.150.192/DocSharing/data/h5test/20170206-171100025/7e9c4178cac1133e0dd9d5b583439122.jpg"
;
docModelPdu
.
relativeUrl
=
"/DocSharing/data/h5test/20170206-171100025/7e9c4178cac1133e0dd9d5b583439122.jpg"
;
docModelPdu
.
curV
=
0
;
docModelPdu
.
curH
=
0
;
docModelPdu
.
scale
=
1
;
docModelPdu
.
visible
=
false
;
docModelPdu
.
action
=
0
;
//0,无操作, 1翻页、2.显示/隐藏
docModelPdu
.
id
=
_param
.
id
||
""
;
//文档在服务器数据库中的唯一id
return
docModelPdu
;
}
unPackPdu
(
owner
,
itemIdx
,
itemData
){
this
.
docList
[
itemIdx
]
=
itemData
;
try
{
console
.
log
(
"文档收到数据===unPackPdu "
);
let
docModelPdu
=
pdu
[
'RCDocSendDataModel'
].
decode
(
itemData
);
//console.log(whiteBoardModelPdu);
loger
.
log
(
docModelPdu
);
return
docModelPdu
;
}
catch
(
err
){
console
.
log
(
"unPackPdu Pdu解析错误,itemIdx="
+
itemIdx
+
" err:"
+
err
.
message
);
}
return
null
;
}
/////收到消息处理/////////////////////////////////////////////////////////////////////////////////
tableInsertHandler
(
owner
,
itemIdx
,
itemData
)
{
//this.tableUpdateHandler(owner, tableId, itemData);
let
itemDataInfo
=
pdu
[
'RCDocSendDataRequestPdu'
].
decode
(
itemData
);
//loger.log('tableInsertHandler---',itemData);
let
itemDataInfo
=
this
.
unPackPdu
(
owner
,
itemIdx
,
itemData
);
loger
.
log
(
'tableInsertHandler'
,
itemDataInfo
);
}
tableDeleteHandler
(
itemIdx
,
item
Data
){
tableDeleteHandler
(
object_id
,
tableDelete
Data
){
/*const re={};
re.type=ApeConsts.DOCUMENT_DEL;
this._emit(MessageTypes.DOC_DELETE, re);*/
loger
.
log
(
'tableDeleteHandler'
,
object_id
,
tableDeleteData
);
//["tableDeleteHandler",1179649,{"type":231,"itemIdx":[1486301768]}]
if
(
tableDeleteData
&&
tableDeleteData
.
itemIdx
){
let
len
=
tableDeleteData
.
itemIdx
.
length
;
let
itemIdxs
=
tableDeleteData
.
itemIdx
;
for
(
let
i
=
0
;
i
<
len
;
i
++
){
if
(
this
.
docList
[
itemIdxs
[
i
]]){
delete
this
.
docList
[
itemIdxs
[
i
]];
loger
.
log
(
"删除文档数据:"
,
itemIdxs
[
i
],
"当前剩余的文档数据"
,
this
.
docList
);
}
}
}
}
tableUpdateHandler
(
owner
,
itemIdx
,
itemData
)
{
let
itemDataInfo
=
pdu
[
'RCDocSendDataRequestPdu'
].
decode
(
itemData
);
//let itemDataInfo = pdu['RCDocSendDataRequestPdu'].decode(itemData);
let
itemDataInfo
=
this
.
unPackPdu
(
owner
,
itemIdx
,
itemData
);
loger
.
log
(
'tableUpdateHandler'
,
itemDataInfo
);
/*try {
const recordInfo = pdu['RCDocSendDataRequestPdu'].decode(itemData);
...
...
src/apes/VideoApe.js
查看文件 @
f69cfbf
...
...
@@ -45,16 +45,30 @@ class VideoChat extends Ape {
// ape listeners
this
.
on
(
pdu
.
RCPDU_VIDEO_SEND_DATA_REQUEST
,
this
.
videoIncomingHandler
.
bind
(
this
));
}
/////////////发送数据操作//////////////////////////////////////////////////////
//获取播流地址
getPlayVideoPath
(
_param
){
loger
.
log
(
'getPlayVideoPath'
);
return
{
"code"
:
0
,
"data"
:
"播放流地址XXXXXXXXXXXXXXXXXXXXX"
};
}
//获取推流地址
getPublishVideoPath
(
_param
){
loger
.
log
(
'getPublishVideoPath'
);
return
{
"code"
:
0
,
"data"
:
"推流地址XXXXXXXXXXXXXXXXXXXXXXX"
};
}
//推流
publishVideo
(
_param
){
loger
.
log
(
'publishVideo'
);
}
//停止推流
stopPublishVideo
(
_param
){
loger
.
log
(
'stopPublishVideo.'
);
}
/////收到消息处理/////////////////////////////////////////////////////////////////////////////////
// 视频消息处理
videoIncomingHandler
(
videoBuffer
)
{
let
videoReceivePdu
=
pdu
[
'VideoSendDataRequestPdu'
].
decode
(
videoBuffer
);
...
...
src/apes/WhiteBoardApe.js
查看文件 @
f69cfbf
...
...
@@ -261,8 +261,8 @@ class WhiteBoardApe extends Ape {
whiteBoardModelPdu
.
type
=
_param
.
type
;
whiteBoardModelPdu
.
itemIdx
=
_itemIdx
;
whiteBoardModelPdu
.
initiator
=
GlobalConfig
.
nodeId
;
whiteBoardModelPdu
.
parentId
=
ApeConsts
.
WHITEBOARD_OBJ_TABLE_ID
;
whiteBoardModelPdu
.
pageNum
=
_param
.
pageNum
||
1
;
whiteBoardModelPdu
.
parentId
=
_param
.
parentId
||
0
;
whiteBoardModelPdu
.
curPage
=
_param
.
curPage
||
1
;
whiteBoardModelPdu
.
pointGroup
=
EngineUtils
.
arrayToJsonString
(
_param
.
pointGroup
);
whiteBoardModelPdu
.
color
=
_param
.
color
||
"#000000"
;
...
...
@@ -274,7 +274,9 @@ class WhiteBoardApe extends Ape {
console
.
log
(
"白板收到数据===unPackPdu "
);
let
whiteBoardModelPdu
=
pdu
[
'RCWhiteBoardDataModel'
].
decode
(
itemData
);
//console.log(whiteBoardModelPdu);
loger
.
log
(
whiteBoardModelPdu
);
//loger.log(whiteBoardModelPdu);
let
_pointGroup
=
EngineUtils
.
arrayFromJsonString
(
whiteBoardModelPdu
.
pointGroup
);
whiteBoardModelPdu
.
pointGroup
=
_pointGroup
;
return
whiteBoardModelPdu
;
}
catch
(
err
){
console
.
log
(
"unPackPdu Pdu解析错误,itemIdx="
+
itemIdx
+
" err:"
+
err
.
message
);
...
...
@@ -300,6 +302,7 @@ class WhiteBoardApe extends Ape {
}*/
let
whiteBoardModel
=
this
.
unPackPdu
(
owner
,
itemIdx
,
itemData
);
loger
.
log
(
'tableInsertHandler'
,
whiteBoardModel
);
this
.
_emit
(
MessageTypes
.
WHITEBOARD_ANNOTAION_INSERT
,
whiteBoardModel
);
}
tableUpdateHandler
(
owner
,
itemIdx
,
itemData
)
{
...
...
@@ -332,6 +335,8 @@ class WhiteBoardApe extends Ape {
} else {
loger.log('白板动作忽略,类型:', ApeConsts(recordInfo.type));
}*/
this
.
_emit
(
MessageTypes
.
WHITEBOARD_ANNOTATION_UPDATE
,
whiteBoardModel
);
}
tableDeleteHandler
(
object_id
,
tableDeleteData
){
// console.log("白板收到数据,tableDeleteHandler object_id="+object_id);//((18<< 16) + 1)=1179649
...
...
@@ -341,8 +346,10 @@ class WhiteBoardApe extends Ape {
let
itemIdxs
=
tableDeleteData
.
itemIdx
;
for
(
let
i
=
0
;
i
<
len
;
i
++
){
if
(
this
.
annoInfos
[
itemIdxs
[
i
]]){
loger
.
log
(
"删除白板数据:"
,
itemIdxs
[
i
],
"当前剩余的白板数据"
);
console
.
log
(
this
.
annoInfos
);
this
.
_emit
(
MessageTypes
.
WHITEBOARD_ANNOTAION_DELETE
,{
"itemIdx"
:
itemIdxs
[
i
]});
this
.
_emit
(
MessageTypes
.
WHITEBOARD_ANNOTAION_DELETE
,{
"itemIdx"
:
itemIdxs
[
i
]});
delete
this
.
annoInfos
[
itemIdxs
[
i
]];
loger
.
log
(
"删除白板数据:"
,
itemIdxs
[
i
],
"当前剩余的白板数据"
,
this
.
annoInfos
);
}
}
}
...
...
src/mcu.js
查看文件 @
f69cfbf
...
...
@@ -12,6 +12,7 @@ import ConferApe from 'apes/ConferApe';
import
ArrayBufferUtil
from
'libs/ArrayBufferUtil'
;
import
Base64
from
'base64-js'
;
import
GlobalConfig
from
'GlobalConfig'
;
import
EngineUtils
from
'EngineUtils'
;
let
loger
=
Loger
.
getLoger
(
'MCU'
);
...
...
@@ -161,7 +162,7 @@ class MCU extends Emiter {
_confInfo
.
confId
=
parseInt
(
_confInfo
.
confId
);
// confId 必须整形
this
.
confInfo
=
_confInfo
;
// 创建刷新nodeId
this
.
confInfo
.
nodeId
=
parseInt
(
Date
.
now
()
/
1000
);
this
.
confInfo
.
nodeId
=
EngineUtils
.
generateNodeID
(
);
GlobalConfig
.
nodeId
=
this
.
confInfo
.
nodeId
;
//这是标识自己身份的id
let
nodeInfoRecordPdu
=
new
pdu
[
'RCNodeInfoRecordPdu'
];
...
...
src/pdus/pro.js
查看文件 @
f69cfbf
...
...
@@ -701,19 +701,35 @@ message RCChatSendDataRequestPdu {
}
message
RCDocSendDataRequestPdu
{
required
int32
id
=
1
;
required
u
int32
id
=
1
;
required
string
doc_type
=
2
;
required
string
uri
=
3
;
optional
int32
owner
=
4
;
optional
int32
from
=
5
;
optional
uint32
owner
=
4
;
optional
uint32
from
=
5
;
optional
string
name
=
6
;
optional
int32
cur_page_no
=
7
;
optional
int32
cur_H
=
8
;
optional
int32
cur_V
=
9
;
optional
int32
scale
=
10
;
optional
int32
page_num
=
11
;
optional
uint32
cur_page_no
=
7
;
optional
uint32
cur_H
=
8
;
optional
uint32
cur_V
=
9
;
optional
uint32
scale
=
10
;
optional
uint32
page_num
=
11
;
}
message
RCDocSendDataModel
{
required
uint32
item_idx
=
1
;
//唯一标识
required
uint32
owner
=
2
;
optional
uint32
from
=
3
;
optional
uint32
cur_page_no
=
4
;
optional
uint32
page_num
=
5
;
required
string
file_type
=
6
;
required
string
doc_type
=
7
;
required
string
relative_url
=
8
;
//文档相对地址
optional
string
url
=
9
;
//文档地址
optional
uint32
cur_V
=
10
;
optional
uint32
cur_H
=
11
;
optional
uint32
scale
=
12
;
optional
bool
visible
=
13
;
optional
uint32
action
=
14
;
//0,无操作, 1翻页、2.显示/隐藏
optional
string
id
=
15
;
//文档在服务器数据库中的唯一id
}
message
RCGiftSendDataRequestPdu
{
optional
uint32
initiator
=
1
;
required
uint32
peer
=
2
;
...
...
@@ -834,7 +850,7 @@ message RCWhiteBoardDataModel {
required
uint32
itemIdx
=
2
;
//itemIdx 每一次绘制的唯一标识
required
uint32
initiator
=
3
;
//绘制来自谁
required
uint32
parentId
=
4
;
//父级的id
required
uint32
pageNum
=
5
;
//页码
required
uint32
curPage
=
5
;
//页码
optional
string
pointGroup
=
6
;
//坐标点集数组的JSON字符串
optional
string
color
=
7
[
default
=
"#000000"
];
//颜色
optional
uint32
thickness
=
8
;
//线条粗细
...
...
请
注册
或
登录
后发表评论