Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
BC
public
liblinphone
Commits
fefbec92
Commit
fefbec92
authored
Oct 05, 2017
by
Sylvain Berfini
🐮
Browse files
Added enum as returned value by ChatMessageModifiers + error code as return parameter
parent
25371cbf
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
65 additions
and
50 deletions
+65
-50
src/chat/chat-message.cpp
src/chat/chat-message.cpp
+20
-20
src/chat/modifier/chat-message-modifier.h
src/chat/modifier/chat-message-modifier.h
+9
-9
src/chat/modifier/cpim-chat-message-modifier.cpp
src/chat/modifier/cpim-chat-message-modifier.cpp
+9
-7
src/chat/modifier/cpim-chat-message-modifier.h
src/chat/modifier/cpim-chat-message-modifier.h
+2
-2
src/chat/modifier/encryption-chat-message-modifier.cpp
src/chat/modifier/encryption-chat-message-modifier.cpp
+15
-4
src/chat/modifier/encryption-chat-message-modifier.h
src/chat/modifier/encryption-chat-message-modifier.h
+2
-2
src/chat/modifier/multipart-chat-message-modifier.cpp
src/chat/modifier/multipart-chat-message-modifier.cpp
+6
-4
src/chat/modifier/multipart-chat-message-modifier.h
src/chat/modifier/multipart-chat-message-modifier.h
+2
-2
No files found.
src/chat/chat-message.cpp
View file @
fefbec92
...
...
@@ -969,7 +969,7 @@ void ChatMessagePrivate::createFileTransferInformationsFromVndGsmaRcsFtHttpXml()
LinphoneReason
ChatMessagePrivate
::
receive
()
{
L_Q
();
int
errorCode
=
0
;
LinphoneReason
reason
=
LinphoneReasonNone
;
bool
store
=
false
;
...
...
@@ -979,34 +979,33 @@ LinphoneReason ChatMessagePrivate::receive() {
if
(
getContentType
()
==
ContentType
::
Cpim
)
{
CpimChatMessageModifier
ccmm
;
ccmm
.
decode
(
this
);
ccmm
.
decode
(
this
,
&
errorCode
);
}
EncryptionChatMessageModifier
ecmm
;
int
retval
=
0
;
retval
=
ecmm
.
decode
(
this
);
if
(
retval
>
0
)
{
ChatMessageModifier
::
Result
result
=
ecmm
.
decode
(
this
,
&
errorCode
);
if
(
result
==
ChatMessageModifier
::
Result
::
Error
)
{
/* Unable to decrypt message */
chatRoom
->
getPrivate
()
->
notifyUndecryptableMessageReceived
(
q
->
getSharedFromThis
());
reason
=
linphone_error_code_to_reason
(
retval
);
reason
=
linphone_error_code_to_reason
(
errorCode
);
q
->
sendDeliveryNotification
(
reason
);
return
reason
;
}
MultipartChatMessageModifier
mcmm
;
mcmm
.
decode
(
this
);
mcmm
.
decode
(
this
,
&
errorCode
);
// ---------------------------------------
// End of message modification
// ---------------------------------------
if
((
retval
<=
0
)
&&
(
linphone_core_is_content_type_supported
(
chatRoom
->
getCore
(),
getContentType
().
asString
().
c_str
())
==
FALSE
))
{
retval
=
415
;
if
((
errorCode
<=
0
)
&&
(
linphone_core_is_content_type_supported
(
chatRoom
->
getCore
(),
getContentType
().
asString
().
c_str
())
==
FALSE
))
{
errorCode
=
415
;
lError
()
<<
"Unsupported MESSAGE (content-type "
<<
getContentType
().
asString
()
<<
" not recognized)"
;
}
if
(
retval
>
0
)
{
reason
=
linphone_error_code_to_reason
(
retval
);
if
(
errorCode
>
0
)
{
reason
=
linphone_error_code_to_reason
(
errorCode
);
q
->
sendDeliveryNotification
(
reason
);
return
reason
;
}
...
...
@@ -1029,6 +1028,7 @@ void ChatMessagePrivate::send() {
L_Q
();
SalOp
*
op
=
salOp
;
LinphoneCall
*
call
=
NULL
;
int
errorCode
=
0
;
if
((
currentSendStep
&
ChatMessagePrivate
::
Step
::
FileUpload
)
==
ChatMessagePrivate
::
Step
::
FileUpload
)
{
lInfo
()
<<
"File upload step already done, skipping"
;
...
...
@@ -1100,7 +1100,7 @@ void ChatMessagePrivate::send() {
}
else
{
if
(
contents
.
size
()
>
1
)
{
MultipartChatMessageModifier
mcmm
;
mcmm
.
encode
(
this
);
mcmm
.
encode
(
this
,
&
errorCode
);
}
currentSendStep
|=
ChatMessagePrivate
::
Step
::
Multipart
;
}
...
...
@@ -1109,13 +1109,13 @@ void ChatMessagePrivate::send() {
lInfo
()
<<
"Encryption step already done, skipping"
;
}
else
{
EncryptionChatMessageModifier
ecmm
;
int
retval
=
ecmm
.
encode
(
this
);
if
(
re
tval
>
0
)
{
if
(
retval
>
1
)
{
sal_error_info_set
((
SalErrorInfo
*
)
op
->
get_error_info
(),
SalReasonNotAcceptable
,
"SIP"
,
retval
,
"Unable to encrypt IM"
,
nullptr
);
q
->
updateState
(
ChatMessage
::
State
::
NotDelive
re
d
);
q
->
store
()
;
}
ChatMessageModifier
::
Result
result
=
ecmm
.
encode
(
this
,
&
errorCode
);
if
(
re
sult
==
ChatMessageModifier
::
Result
::
Error
)
{
sal_error_info_set
((
SalErrorInfo
*
)
op
->
get_error_info
(),
SalReasonNotAcceptable
,
"SIP"
,
errorCode
,
"Unable to encrypt IM"
,
nullptr
);
q
->
updateState
(
ChatMessage
::
State
::
NotDelivered
);
q
->
sto
re
(
);
return
;
}
else
if
(
result
==
ChatMessageModifier
::
Result
::
Suspended
)
{
return
;
}
currentSendStep
|=
ChatMessagePrivate
::
Step
::
Encryption
;
...
...
@@ -1126,7 +1126,7 @@ void ChatMessagePrivate::send() {
}
else
{
if
(
lp_config_get_int
(
chatRoom
->
getCore
()
->
config
,
"sip"
,
"use_cpim"
,
0
)
==
1
)
{
CpimChatMessageModifier
ccmm
;
ccmm
.
encode
(
this
);
ccmm
.
encode
(
this
,
&
errorCode
);
}
currentSendStep
|=
ChatMessagePrivate
::
Step
::
Cpim
;
}
...
...
src/chat/modifier/chat-message-modifier.h
View file @
fefbec92
...
...
@@ -30,27 +30,27 @@ class ChatMessagePrivate;
class
ChatMessageModifier
{
public:
enum
Result
{
Skipped
=
-
1
,
Done
=
0
,
Suspended
=
1
,
Error
=
2
};
virtual
~
ChatMessageModifier
()
=
default
;
/**
* This method will be called when the message is about to be sent.
* It should check first if the internalContent is filled.
* If so, it should apply it's changes to it, otherwise it should use the contentsList.
* If it returns 0, it means everything went well.
* If it returns -1, it means it didn't change anything.
* If it returns 1, it means to abort the sending process and it will be resumed later.
* If it returns any other value > 1, it's an error code.
*/
virtual
in
t
encode
(
ChatMessagePrivate
*
messagePrivate
)
=
0
;
virtual
Resul
t
encode
(
ChatMessagePrivate
*
messagePrivate
,
int
*
errorCode
)
=
0
;
/**
* This method will be called when the message is about to be received.
* It should apply it's changes to the internal content, the last modifier will take care of filling the contentsList.
* If it returns 0, it means everything went well.
* If it returns -1, it means it didn't change anything.
* If it returns any other value > 0, it's an error code.
*/
virtual
in
t
decode
(
ChatMessagePrivate
*
messagePrivate
)
=
0
;
virtual
Resul
t
decode
(
ChatMessagePrivate
*
messagePrivate
,
int
*
errorCode
)
=
0
;
};
LINPHONE_END_NAMESPACE
...
...
src/chat/modifier/cpim-chat-message-modifier.cpp
View file @
fefbec92
...
...
@@ -31,7 +31,7 @@ using namespace std;
LINPHONE_BEGIN_NAMESPACE
in
t
CpimChatMessageModifier
::
encode
(
ChatMessagePrivate
*
messagePrivate
)
{
ChatMessageModifier
::
Resul
t
CpimChatMessageModifier
::
encode
(
ChatMessagePrivate
*
messagePrivate
,
int
*
errorCode
)
{
Cpim
::
Message
message
;
Cpim
::
GenericHeader
cpimContentTypeHeader
;
cpimContentTypeHeader
.
setName
(
"Content-Type"
);
...
...
@@ -62,7 +62,8 @@ int CpimChatMessageModifier::encode (ChatMessagePrivate *messagePrivate) {
if
(
!
message
.
isValid
())
{
lError
()
<<
"[CPIM] Message is invalid: "
<<
contentBody
;
return
500
;
*
errorCode
=
500
;
return
ChatMessageModifier
::
Result
::
Error
;
}
else
{
Content
newContent
;
ContentType
newContentType
(
"Message/CPIM"
);
...
...
@@ -70,10 +71,10 @@ int CpimChatMessageModifier::encode (ChatMessagePrivate *messagePrivate) {
newContent
.
setBody
(
message
.
asString
());
messagePrivate
->
internalContent
=
newContent
;
}
return
0
;
return
ChatMessageModifier
::
Result
::
Done
;
}
in
t
CpimChatMessageModifier
::
decode
(
ChatMessagePrivate
*
messagePrivate
)
{
ChatMessageModifier
::
Resul
t
CpimChatMessageModifier
::
decode
(
ChatMessagePrivate
*
messagePrivate
,
int
*
errorCode
)
{
Content
content
;
if
(
!
messagePrivate
->
internalContent
.
isEmpty
())
{
content
=
messagePrivate
->
internalContent
;
...
...
@@ -93,13 +94,14 @@ int CpimChatMessageModifier::decode (ChatMessagePrivate *messagePrivate) {
messagePrivate
->
internalContent
=
newContent
;
}
else
{
lError
()
<<
"[CPIM] Message is invalid: "
<<
contentBody
;
return
500
;
*
errorCode
=
500
;
return
ChatMessageModifier
::
Result
::
Error
;
}
}
else
{
lError
()
<<
"[CPIM] Message is not CPIM but "
<<
content
.
getContentType
().
asString
();
return
-
1
;
return
ChatMessageModifier
::
Result
::
Skipped
;
}
return
0
;
return
ChatMessageModifier
::
Result
::
Done
;
}
LINPHONE_END_NAMESPACE
src/chat/modifier/cpim-chat-message-modifier.h
View file @
fefbec92
...
...
@@ -29,8 +29,8 @@ class CpimChatMessageModifier : public ChatMessageModifier {
public:
CpimChatMessageModifier
()
=
default
;
in
t
encode
(
ChatMessagePrivate
*
messagePrivate
)
override
;
in
t
decode
(
ChatMessagePrivate
*
messagePrivate
)
override
;
Resul
t
encode
(
ChatMessagePrivate
*
messagePrivate
,
int
*
errorCode
)
override
;
Resul
t
decode
(
ChatMessagePrivate
*
messagePrivate
,
int
*
errorCode
)
override
;
};
LINPHONE_END_NAMESPACE
...
...
src/chat/modifier/encryption-chat-message-modifier.cpp
View file @
fefbec92
...
...
@@ -33,7 +33,7 @@ using namespace std;
LINPHONE_BEGIN_NAMESPACE
in
t
EncryptionChatMessageModifier
::
encode
(
ChatMessagePrivate
*
messagePrivate
)
{
ChatMessageModifier
::
Resul
t
EncryptionChatMessageModifier
::
encode
(
ChatMessagePrivate
*
messagePrivate
,
int
*
errorCode
)
{
int
retval
=
-
1
;
LinphoneImEncryptionEngine
*
imee
=
messagePrivate
->
chatRoom
->
getCore
()
->
im_encryption_engine
;
if
(
imee
)
{
...
...
@@ -43,13 +43,19 @@ int EncryptionChatMessageModifier::encode (ChatMessagePrivate *messagePrivate) {
retval
=
cbProcessOutgoingMessage
(
imee
,
L_GET_C_BACK_PTR
(
messagePrivate
->
chatRoom
),
L_GET_C_BACK_PTR
(
messagePrivate
->
getPublic
()
->
getSharedFromThis
()));
if
(
retval
==
0
||
retval
==
1
)
{
messagePrivate
->
isSecured
=
true
;
if
(
retval
==
1
)
{
return
ChatMessageModifier
::
Result
::
Suspended
;
}
return
ChatMessageModifier
::
Result
::
Done
;
}
*
errorCode
=
retval
;
return
ChatMessageModifier
::
Result
::
Error
;
}
}
return
retval
;
return
ChatMessageModifier
::
Result
::
Skipped
;
}
in
t
EncryptionChatMessageModifier
::
decode
(
ChatMessagePrivate
*
messagePrivate
)
{
ChatMessageModifier
::
Resul
t
EncryptionChatMessageModifier
::
decode
(
ChatMessagePrivate
*
messagePrivate
,
int
*
errorCode
)
{
int
retval
=
-
1
;
LinphoneImEncryptionEngine
*
imee
=
messagePrivate
->
chatRoom
->
getCore
()
->
im_encryption_engine
;
if
(
imee
)
{
...
...
@@ -59,10 +65,15 @@ int EncryptionChatMessageModifier::decode (ChatMessagePrivate *messagePrivate) {
retval
=
cbProcessIncomingMessage
(
imee
,
L_GET_C_BACK_PTR
(
messagePrivate
->
chatRoom
),
L_GET_C_BACK_PTR
(
messagePrivate
->
getPublic
()
->
getSharedFromThis
()));
if
(
retval
==
0
)
{
messagePrivate
->
isSecured
=
true
;
return
ChatMessageModifier
::
Result
::
Done
;
}
else
if
(
retval
==
-
1
)
{
return
ChatMessageModifier
::
Result
::
Skipped
;
}
*
errorCode
=
retval
;
return
ChatMessageModifier
::
Result
::
Error
;
}
}
return
retval
;
return
ChatMessageModifier
::
Result
::
Skipped
;
}
LINPHONE_END_NAMESPACE
src/chat/modifier/encryption-chat-message-modifier.h
View file @
fefbec92
...
...
@@ -29,8 +29,8 @@ class EncryptionChatMessageModifier : public ChatMessageModifier {
public:
EncryptionChatMessageModifier
()
=
default
;
in
t
encode
(
ChatMessagePrivate
*
messagePrivate
)
override
;
in
t
decode
(
ChatMessagePrivate
*
messagePrivate
)
override
;
Resul
t
encode
(
ChatMessagePrivate
*
messagePrivate
,
int
*
errorCode
)
override
;
Resul
t
decode
(
ChatMessagePrivate
*
messagePrivate
,
int
*
errorCode
)
override
;
};
LINPHONE_END_NAMESPACE
...
...
src/chat/modifier/multipart-chat-message-modifier.cpp
View file @
fefbec92
...
...
@@ -26,22 +26,24 @@ using namespace std;
LINPHONE_BEGIN_NAMESPACE
in
t
MultipartChatMessageModifier
::
encode
(
ChatMessagePrivate
*
messagePrivate
)
{
ChatMessageModifier
::
Resul
t
MultipartChatMessageModifier
::
encode
(
ChatMessagePrivate
*
messagePrivate
,
int
*
errorCode
)
{
if
(
messagePrivate
->
contents
.
size
()
>
1
)
{
//TODO
return
ChatMessageModifier
::
Result
::
Done
;
}
return
0
;
return
ChatMessageModifier
::
Result
::
Skipped
;
}
in
t
MultipartChatMessageModifier
::
decode
(
ChatMessagePrivate
*
messagePrivate
)
{
ChatMessageModifier
::
Resul
t
MultipartChatMessageModifier
::
decode
(
ChatMessagePrivate
*
messagePrivate
,
int
*
errorCode
)
{
//TODO
if
(
false
)
{
// Multipart required
return
ChatMessageModifier
::
Result
::
Done
;
}
else
if
(
messagePrivate
->
contents
.
size
()
==
0
)
{
// All previous modifiers only altered the internal content, let's fill the content list because we're the last modifier to be called
messagePrivate
->
contents
.
push_back
(
messagePrivate
->
internalContent
);
}
return
0
;
return
ChatMessageModifier
::
Result
::
Skipped
;
}
LINPHONE_END_NAMESPACE
src/chat/modifier/multipart-chat-message-modifier.h
View file @
fefbec92
...
...
@@ -29,8 +29,8 @@ class MultipartChatMessageModifier : public ChatMessageModifier {
public:
MultipartChatMessageModifier
()
=
default
;
in
t
encode
(
ChatMessagePrivate
*
message
)
override
;
in
t
decode
(
ChatMessagePrivate
*
message
)
override
;
Resul
t
encode
(
ChatMessagePrivate
*
message
,
int
*
errorCode
)
override
;
Resul
t
decode
(
ChatMessagePrivate
*
message
,
int
*
errorCode
)
override
;
};
LINPHONE_END_NAMESPACE
...
...
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