Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
27b4f11c
Commit
27b4f11c
authored
Sep 04, 2010
by
Jacek Caban
Committed by
Alexandre Julliard
Sep 06, 2010
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
msxml3: Use xmlnode child object's IXMLDOMNode implementation as base interface.
The plan is to get rid of IXMLDOMNode interface in xmlnode object and use proper inheritance.
parent
8a82ae66
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
37 additions
and
127 deletions
+37
-127
attribute.c
dlls/msxml3/attribute.c
+1
-4
cdata.c
dlls/msxml3/cdata.c
+3
-7
comment.c
dlls/msxml3/comment.c
+2
-5
docfrag.c
dlls/msxml3/docfrag.c
+1
-4
domdoc.c
dlls/msxml3/domdoc.c
+5
-6
element.c
dlls/msxml3/element.c
+1
-4
entityref.c
dlls/msxml3/entityref.c
+1
-4
node.c
dlls/msxml3/node.c
+18
-80
pi.c
dlls/msxml3/pi.c
+3
-7
text.c
dlls/msxml3/text.c
+2
-6
No files found.
dlls/msxml3/attribute.c
View file @
27b4f11c
...
...
@@ -58,15 +58,12 @@ static HRESULT WINAPI domattr_QueryInterface(
TRACE
(
"(%p)->(%s %p)
\n
"
,
This
,
debugstr_guid
(
riid
),
ppvObject
);
if
(
IsEqualGUID
(
riid
,
&
IID_IXMLDOMAttribute
)
||
IsEqualGUID
(
riid
,
&
IID_IXMLDOMNode
)
||
IsEqualGUID
(
riid
,
&
IID_IDispatch
)
||
IsEqualGUID
(
riid
,
&
IID_IUnknown
)
)
{
*
ppvObject
=
iface
;
}
else
if
(
IsEqualGUID
(
riid
,
&
IID_IXMLDOMNode
)
)
{
*
ppvObject
=
IXMLDOMNode_from_impl
(
&
This
->
node
);
}
else
if
(
node_query_interface
(
&
This
->
node
,
riid
,
ppvObject
))
{
return
*
ppvObject
?
S_OK
:
E_NOINTERFACE
;
...
...
dlls/msxml3/cdata.c
View file @
27b4f11c
...
...
@@ -59,15 +59,12 @@ static HRESULT WINAPI domcdata_QueryInterface(
if
(
IsEqualGUID
(
riid
,
&
IID_IXMLDOMCDATASection
)
||
IsEqualGUID
(
riid
,
&
IID_IXMLDOMCharacterData
)
||
IsEqualGUID
(
riid
,
&
IID_IXMLDOMNode
)
||
IsEqualGUID
(
riid
,
&
IID_IDispatch
)
||
IsEqualGUID
(
riid
,
&
IID_IUnknown
)
)
{
*
ppvObject
=
iface
;
}
else
if
(
IsEqualGUID
(
riid
,
&
IID_IXMLDOMNode
)
)
{
*
ppvObject
=
IXMLDOMNode_from_impl
(
&
This
->
node
);
}
else
if
(
IsEqualGUID
(
riid
,
&
IID_IXMLDOMText
)
||
IsEqualGUID
(
riid
,
&
IID_IXMLDOMElement
)
)
{
...
...
@@ -483,14 +480,13 @@ static HRESULT WINAPI domcdata_get_data(
IXMLDOMCDATASection
*
iface
,
BSTR
*
p
)
{
domcdata
*
This
=
impl_from_IXMLDOMCDATASection
(
iface
);
HRESULT
hr
;
VARIANT
vRet
;
if
(
!
p
)
return
E_INVALIDARG
;
hr
=
IXMLDOM
Node_get_nodeValue
(
IXMLDOMNode_from_impl
(
&
This
->
node
)
,
&
vRet
);
hr
=
IXMLDOM
CDATASection_get_nodeValue
(
iface
,
&
vRet
);
if
(
hr
==
S_OK
)
{
*
p
=
V_BSTR
(
&
vRet
);
...
...
@@ -511,7 +507,7 @@ static HRESULT WINAPI domcdata_put_data(
V_VT
(
&
val
)
=
VT_BSTR
;
V_BSTR
(
&
val
)
=
data
;
return
IXMLDOM
Node_put_nodeValue
(
IXMLDOMNode_from_impl
(
&
This
->
node
)
,
val
);
return
IXMLDOM
CDATASection_put_nodeValue
(
iface
,
val
);
}
static
HRESULT
WINAPI
domcdata_get_length
(
...
...
dlls/msxml3/comment.c
View file @
27b4f11c
...
...
@@ -59,15 +59,12 @@ static HRESULT WINAPI domcomment_QueryInterface(
if
(
IsEqualGUID
(
riid
,
&
IID_IXMLDOMComment
)
||
IsEqualGUID
(
riid
,
&
IID_IXMLDOMCharacterData
)
||
IsEqualGUID
(
riid
,
&
IID_IXMLDOMNode
)
||
IsEqualGUID
(
riid
,
&
IID_IDispatch
)
||
IsEqualGUID
(
riid
,
&
IID_IUnknown
)
)
{
*
ppvObject
=
iface
;
}
else
if
(
IsEqualGUID
(
riid
,
&
IID_IXMLDOMNode
)
)
{
*
ppvObject
=
IXMLDOMNode_from_impl
(
&
This
->
node
);
}
else
if
(
node_query_interface
(
&
This
->
node
,
riid
,
ppvObject
))
{
return
*
ppvObject
?
S_OK
:
E_NOINTERFACE
;
...
...
@@ -486,7 +483,7 @@ static HRESULT WINAPI domcomment_get_data(
if
(
!
p
)
return
E_INVALIDARG
;
hr
=
IXMLDOM
Node_get_nodeValue
(
IXMLDOMNode_from_impl
(
&
This
->
node
)
,
&
vRet
);
hr
=
IXMLDOM
Comment_get_nodeValue
(
iface
,
&
vRet
);
if
(
hr
==
S_OK
)
{
*
p
=
V_BSTR
(
&
vRet
);
...
...
dlls/msxml3/docfrag.c
View file @
27b4f11c
...
...
@@ -58,15 +58,12 @@ static HRESULT WINAPI domfrag_QueryInterface(
TRACE
(
"(%p)->(%s %p)
\n
"
,
This
,
debugstr_guid
(
riid
),
ppvObject
);
if
(
IsEqualGUID
(
riid
,
&
IID_IXMLDOMDocumentFragment
)
||
IsEqualGUID
(
riid
,
&
IID_IXMLDOMNode
)
||
IsEqualGUID
(
riid
,
&
IID_IDispatch
)
||
IsEqualGUID
(
riid
,
&
IID_IUnknown
)
)
{
*
ppvObject
=
iface
;
}
else
if
(
IsEqualGUID
(
riid
,
&
IID_IXMLDOMNode
)
)
{
*
ppvObject
=
IXMLDOMNode_from_impl
(
&
This
->
node
);
}
else
if
(
node_query_interface
(
&
This
->
node
,
riid
,
ppvObject
))
{
return
*
ppvObject
?
S_OK
:
E_NOINTERFACE
;
...
...
dlls/msxml3/domdoc.c
View file @
27b4f11c
...
...
@@ -425,7 +425,7 @@ static HRESULT WINAPI domdoc_IPersistStreamInit_Save(
TRACE
(
"(%p)->(%p %d)
\n
"
,
This
,
stream
,
clr_dirty
);
hr
=
IXMLDOM
Node_get_xml
(
IXMLDOMNode_from_impl
(
&
This
->
node
)
,
&
xmlString
);
hr
=
IXMLDOM
Document3_get_xml
(
(
IXMLDOMDocument3
*
)
&
This
->
lpVtbl
,
&
xmlString
);
if
(
hr
==
S_OK
)
{
DWORD
len
=
SysStringLen
(
xmlString
)
*
sizeof
(
WCHAR
);
...
...
@@ -518,16 +518,13 @@ static HRESULT WINAPI domdoc_QueryInterface( IXMLDOMDocument3 *iface, REFIID rii
if
(
IsEqualGUID
(
riid
,
&
IID_IUnknown
)
||
IsEqualGUID
(
riid
,
&
IID_IDispatch
)
||
IsEqualGUID
(
riid
,
&
IID_IXMLDOMNode
)
||
IsEqualGUID
(
riid
,
&
IID_IXMLDOMDocument
)
||
IsEqualGUID
(
riid
,
&
IID_IXMLDOMDocument2
)
||
IsEqualGUID
(
riid
,
&
IID_IXMLDOMDocument3
))
{
*
ppvObject
=
iface
;
}
else
if
(
IsEqualGUID
(
riid
,
&
IID_IXMLDOMNode
)
)
{
*
ppvObject
=
IXMLDOMNode_from_impl
(
&
This
->
node
);
}
else
if
(
IsEqualGUID
(
&
IID_IPersistStream
,
riid
)
||
IsEqualGUID
(
&
IID_IPersistStreamInit
,
riid
))
{
...
...
@@ -1284,12 +1281,14 @@ static HRESULT WINAPI domdoc_createProcessingInstruction(
if
(
hr
==
S_OK
)
{
VARIANT
v_data
;
xmlnode
*
node_obj
;
/* this is to bypass check in ::put_data() that blocks "<?xml" PIs */
node_obj
=
get_node_obj
(
node
);
V_VT
(
&
v_data
)
=
VT_BSTR
;
V_BSTR
(
&
v_data
)
=
data
;
hr
=
IXMLDOMNode_put_nodeValue
(
node
,
v_data
);
hr
=
IXMLDOMNode_put_nodeValue
(
IXMLDOMNode_from_impl
(
node_obj
)
,
v_data
);
IXMLDOMNode_QueryInterface
(
node
,
&
IID_IXMLDOMProcessingInstruction
,
(
void
**
)
pi
);
IXMLDOMNode_Release
(
node
);
...
...
dlls/msxml3/element.c
View file @
27b4f11c
...
...
@@ -65,15 +65,12 @@ static HRESULT WINAPI domelem_QueryInterface(
TRACE
(
"(%p)->(%s %p)
\n
"
,
This
,
debugstr_guid
(
riid
),
ppvObject
);
if
(
IsEqualGUID
(
riid
,
&
IID_IXMLDOMElement
)
||
IsEqualGUID
(
riid
,
&
IID_IXMLDOMNode
)
||
IsEqualGUID
(
riid
,
&
IID_IDispatch
)
||
IsEqualGUID
(
riid
,
&
IID_IUnknown
)
)
{
*
ppvObject
=
&
This
->
lpVtbl
;
}
else
if
(
IsEqualGUID
(
riid
,
&
IID_IXMLDOMNode
)
)
{
*
ppvObject
=
IXMLDOMNode_from_impl
(
&
This
->
node
);
}
else
if
(
node_query_interface
(
&
This
->
node
,
riid
,
ppvObject
))
{
return
*
ppvObject
?
S_OK
:
E_NOINTERFACE
;
...
...
dlls/msxml3/entityref.c
View file @
27b4f11c
...
...
@@ -58,15 +58,12 @@ static HRESULT WINAPI entityref_QueryInterface(
TRACE
(
"(%p)->(%s %p)
\n
"
,
This
,
debugstr_guid
(
riid
),
ppvObject
);
if
(
IsEqualGUID
(
riid
,
&
IID_IXMLDOMEntityReference
)
||
IsEqualGUID
(
riid
,
&
IID_IXMLDOMNode
)
||
IsEqualGUID
(
riid
,
&
IID_IDispatch
)
||
IsEqualGUID
(
riid
,
&
IID_IUnknown
)
)
{
*
ppvObject
=
iface
;
}
else
if
(
IsEqualGUID
(
riid
,
&
IID_IXMLDOMNode
)
)
{
*
ppvObject
=
IXMLDOMNode_from_impl
(
&
This
->
node
);
}
else
if
(
node_query_interface
(
&
This
->
node
,
riid
,
ppvObject
))
{
return
*
ppvObject
?
S_OK
:
E_NOINTERFACE
;
...
...
dlls/msxml3/node.c
View file @
27b4f11c
...
...
@@ -115,55 +115,30 @@ static HRESULT WINAPI xmlnode_QueryInterface(
REFIID
riid
,
void
**
ppvObject
)
{
xmlnode
*
This
=
impl_from_IXMLDOMNode
(
iface
);
TRACE
(
"(%p)->(%s %p)
\n
"
,
This
,
debugstr_guid
(
riid
),
ppvObject
);
if
(
This
->
iface
)
return
IXMLDOMNode_QueryInterface
(
This
->
iface
,
riid
,
ppvObject
);
if
(
IsEqualGUID
(
riid
,
&
IID_IUnknown
))
{
*
ppvObject
=
iface
;
}
else
if
(
IsEqualGUID
(
riid
,
&
IID_IDispatch
)
||
IsEqualGUID
(
riid
,
&
IID_IXMLDOMNode
))
{
*
ppvObject
=
&
This
->
lpVtbl
;
}
else
if
(
node_query_interface
(
This
,
riid
,
ppvObject
))
{
return
*
ppvObject
?
S_OK
:
E_NOINTERFACE
;
}
else
{
FIXME
(
"interface %s not implemented
\n
"
,
debugstr_guid
(
riid
));
*
ppvObject
=
NULL
;
ERR
(
"Should not be called
\n
"
);
return
E_NOINTERFACE
;
}
IUnknown_AddRef
(
(
IUnknown
*
)
*
ppvObject
);
return
S_OK
;
}
static
ULONG
WINAPI
xmlnode_AddRef
(
IXMLDOMNode
*
iface
)
{
xmlnode
*
This
=
impl_from_IXMLDOMNode
(
iface
);
return
IXMLDOMNode_AddRef
(
This
->
iface
)
;
ERR
(
"Should not be called
\n
"
);
return
2
;
}
static
ULONG
WINAPI
xmlnode_Release
(
IXMLDOMNode
*
iface
)
{
xmlnode
*
This
=
impl_from_IXMLDOMNode
(
iface
);
return
IXMLDOMNode_Release
(
This
->
iface
)
;
ERR
(
"Should not be called
\n
"
);
return
1
;
}
static
HRESULT
WINAPI
xmlnode_GetTypeInfoCount
(
IXMLDOMNode
*
iface
,
UINT
*
pctinfo
)
{
xmlnode
*
This
=
impl_from_IXMLDOMNode
(
iface
);
TRACE
(
"(%p)->(%p)
\n
"
,
This
,
pctinfo
);
*
pctinfo
=
1
;
return
S_OK
;
ERR
(
"Should not be called
\n
"
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
xmlnode_GetTypeInfo
(
...
...
@@ -172,14 +147,8 @@ static HRESULT WINAPI xmlnode_GetTypeInfo(
LCID
lcid
,
ITypeInfo
**
ppTInfo
)
{
xmlnode
*
This
=
impl_from_IXMLDOMNode
(
iface
);
HRESULT
hr
;
TRACE
(
"(%p)->(%u %u %p)
\n
"
,
This
,
iTInfo
,
lcid
,
ppTInfo
);
hr
=
get_typeinfo
(
IXMLDOMNode_tid
,
ppTInfo
);
return
hr
;
ERR
(
"Should not be called
\n
"
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
xmlnode_GetIDsOfNames
(
...
...
@@ -190,25 +159,8 @@ static HRESULT WINAPI xmlnode_GetIDsOfNames(
LCID
lcid
,
DISPID
*
rgDispId
)
{
xmlnode
*
This
=
impl_from_IXMLDOMNode
(
iface
);
ITypeInfo
*
typeinfo
;
HRESULT
hr
;
TRACE
(
"(%p)->(%s %p %u %u %p)
\n
"
,
This
,
debugstr_guid
(
riid
),
rgszNames
,
cNames
,
lcid
,
rgDispId
);
if
(
!
rgszNames
||
cNames
==
0
||
!
rgDispId
)
return
E_INVALIDARG
;
hr
=
get_typeinfo
(
IXMLDOMNode_tid
,
&
typeinfo
);
if
(
SUCCEEDED
(
hr
))
{
hr
=
ITypeInfo_GetIDsOfNames
(
typeinfo
,
rgszNames
,
cNames
,
rgDispId
);
ITypeInfo_Release
(
typeinfo
);
}
return
hr
;
ERR
(
"Should not be called
\n
"
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
xmlnode_Invoke
(
...
...
@@ -222,22 +174,8 @@ static HRESULT WINAPI xmlnode_Invoke(
EXCEPINFO
*
pExcepInfo
,
UINT
*
puArgErr
)
{
xmlnode
*
This
=
impl_from_IXMLDOMNode
(
iface
);
ITypeInfo
*
typeinfo
;
HRESULT
hr
;
TRACE
(
"(%p)->(%d %s %d %d %p %p %p %p)
\n
"
,
This
,
dispIdMember
,
debugstr_guid
(
riid
),
lcid
,
wFlags
,
pDispParams
,
pVarResult
,
pExcepInfo
,
puArgErr
);
hr
=
get_typeinfo
(
IXMLDOMNode_tid
,
&
typeinfo
);
if
(
SUCCEEDED
(
hr
))
{
hr
=
ITypeInfo_Invoke
(
typeinfo
,
&
(
This
->
lpVtbl
),
dispIdMember
,
wFlags
,
pDispParams
,
pVarResult
,
pExcepInfo
,
puArgErr
);
ITypeInfo_Release
(
typeinfo
);
}
return
hr
;
ERR
(
"Should not be called
\n
"
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
xmlnode_get_nodeName
(
...
...
@@ -556,7 +494,7 @@ static HRESULT WINAPI xmlnode_get_attributes(
*
attributeMap
=
NULL
;
return
S_FALSE
;
default:
*
attributeMap
=
create_nodemap
(
iface
);
*
attributeMap
=
create_nodemap
(
This
->
iface
);
return
S_OK
;
}
}
...
...
@@ -764,7 +702,7 @@ static HRESULT WINAPI xmlnode_appendChild(
}
VariantInit
(
&
var
);
return
IXMLDOMNode_insertBefore
(
iface
,
newChild
,
var
,
outNewChild
);
return
IXMLDOMNode_insertBefore
(
This
->
iface
,
newChild
,
var
,
outNewChild
);
}
static
HRESULT
WINAPI
xmlnode_hasChildNodes
(
...
...
@@ -1176,10 +1114,10 @@ static HRESULT WINAPI xmlnode_get_nodeTypedValue(
if
(
This
->
node
->
type
==
XML_ELEMENT_NODE
||
This
->
node
->
type
==
XML_TEXT_NODE
||
This
->
node
->
type
==
XML_ENTITY_REF_NODE
)
hres
=
IXMLDOMNode_get_dataType
(
iface
,
&
type
);
hres
=
IXMLDOMNode_get_dataType
(
This
->
iface
,
&
type
);
if
(
hres
!=
S_OK
&&
This
->
node
->
type
!=
XML_ELEMENT_NODE
)
return
IXMLDOMNode_get_nodeValue
(
iface
,
typedValue
);
return
IXMLDOMNode_get_nodeValue
(
This
->
iface
,
typedValue
);
content
=
xmlNodeGetContent
(
This
->
node
);
hres
=
VARIANT_from_xmlChar
(
content
,
typedValue
,
...
...
@@ -1566,7 +1504,7 @@ static HRESULT WINAPI xmlnode_selectSingleNode(
TRACE
(
"(%p)->(%s %p)
\n
"
,
This
,
debugstr_w
(
queryString
),
resultNode
);
*
resultNode
=
NULL
;
r
=
IXMLDOMNode_selectNodes
(
iface
,
queryString
,
&
list
);
r
=
IXMLDOMNode_selectNodes
(
This
->
iface
,
queryString
,
&
list
);
if
(
r
==
S_OK
)
{
r
=
IXMLDOMNodeList_nextNode
(
list
,
resultNode
);
...
...
dlls/msxml3/pi.c
View file @
27b4f11c
...
...
@@ -58,15 +58,12 @@ static HRESULT WINAPI dom_pi_QueryInterface(
TRACE
(
"(%p)->(%s %p)
\n
"
,
This
,
debugstr_guid
(
riid
),
ppvObject
);
if
(
IsEqualGUID
(
riid
,
&
IID_IXMLDOMProcessingInstruction
)
||
IsEqualGUID
(
riid
,
&
IID_IXMLDOMNode
)
||
IsEqualGUID
(
riid
,
&
IID_IDispatch
)
||
IsEqualGUID
(
riid
,
&
IID_IUnknown
)
)
{
*
ppvObject
=
iface
;
}
else
if
(
IsEqualGUID
(
riid
,
&
IID_IXMLDOMNode
)
)
{
*
ppvObject
=
IXMLDOMNode_from_impl
(
&
This
->
node
);
}
else
if
(
node_query_interface
(
&
This
->
node
,
riid
,
ppvObject
))
{
return
*
ppvObject
?
S_OK
:
E_NOINTERFACE
;
...
...
@@ -504,14 +501,13 @@ static HRESULT WINAPI dom_pi_get_data(
IXMLDOMProcessingInstruction
*
iface
,
BSTR
*
p
)
{
dom_pi
*
This
=
impl_from_IXMLDOMProcessingInstruction
(
iface
);
HRESULT
hr
=
E_FAIL
;
VARIANT
vRet
;
if
(
!
p
)
return
E_INVALIDARG
;
hr
=
IXMLDOM
Node_get_nodeValue
(
IXMLDOMNode_from_impl
(
&
This
->
node
)
,
&
vRet
);
hr
=
IXMLDOM
ProcessingInstruction_get_nodeValue
(
iface
,
&
vRet
);
if
(
hr
==
S_OK
)
{
*
p
=
V_BSTR
(
&
vRet
);
...
...
@@ -548,7 +544,7 @@ static HRESULT WINAPI dom_pi_put_data(
V_VT
(
&
val
)
=
VT_BSTR
;
V_BSTR
(
&
val
)
=
data
;
hr
=
IXMLDOM
Node_put_nodeValue
(
IXMLDOMNode_from_impl
(
&
This
->
node
)
,
val
);
hr
=
IXMLDOM
ProcessingInstruction_put_nodeValue
(
iface
,
val
);
return
hr
;
}
...
...
dlls/msxml3/text.c
View file @
27b4f11c
...
...
@@ -60,15 +60,12 @@ static HRESULT WINAPI domtext_QueryInterface(
if
(
IsEqualGUID
(
riid
,
&
IID_IXMLDOMText
)
||
IsEqualGUID
(
riid
,
&
IID_IXMLDOMCharacterData
)
||
IsEqualGUID
(
riid
,
&
IID_IXMLDOMNode
)
||
IsEqualGUID
(
riid
,
&
IID_IDispatch
)
||
IsEqualGUID
(
riid
,
&
IID_IUnknown
)
)
{
*
ppvObject
=
iface
;
}
else
if
(
IsEqualGUID
(
riid
,
&
IID_IXMLDOMNode
)
)
{
*
ppvObject
=
IXMLDOMNode_from_impl
(
&
This
->
node
);
}
else
if
(
node_query_interface
(
&
This
->
node
,
riid
,
ppvObject
))
{
return
*
ppvObject
?
S_OK
:
E_NOINTERFACE
;
...
...
@@ -485,14 +482,13 @@ static HRESULT WINAPI domtext_get_data(
IXMLDOMText
*
iface
,
BSTR
*
p
)
{
domtext
*
This
=
impl_from_IXMLDOMText
(
iface
);
HRESULT
hr
;
VARIANT
vRet
;
if
(
!
p
)
return
E_INVALIDARG
;
hr
=
IXMLDOMNode_get_nodeValue
(
IXMLDOMNode_from_impl
(
&
This
->
node
)
,
&
vRet
);
hr
=
IXMLDOMNode_get_nodeValue
(
iface
,
&
vRet
);
if
(
hr
==
S_OK
)
{
*
p
=
V_BSTR
(
&
vRet
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment