Skip to content

Commit d82313d

Browse files
author
Korbinian Kram
committed
release 2.8.1
1 parent 52a1465 commit d82313d

File tree

47 files changed

+730
-57
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+730
-57
lines changed

Bindings/Python/PyInstantSupportModule.cpp

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,26 @@ PyObject* PyInstantSupportModule_requestInstantSupport(PyInstantSupportModule* s
238238
pySessionCode ? PyUnicode_AsUTF8(pySessionCode) : nullptr));
239239
}
240240

241+
PyObject* PyInstantSupportModule_closeInstantSupportCase(PyInstantSupportModule* self, PyObject* arg)
242+
{
243+
const char* accessTokenName = "accessToken";
244+
const char* sessionCodeName = "sessionCode";
245+
246+
PyObject* pyAccessToken = PyDict_GetItemString(arg, accessTokenName);
247+
if (pyAccessToken == nullptr)
248+
{
249+
PyErr_SetString(PyExc_KeyError, accessTokenName);
250+
return nullptr;
251+
}
252+
253+
PyObject* pySessionCode = PyDict_GetItemString(arg, sessionCodeName);
254+
255+
return NoneOrInternalError(
256+
self->m_module->closeInstantSupportCase(
257+
PyUnicode_AsUTF8(pyAccessToken),
258+
pySessionCode ? PyUnicode_AsUTF8(pySessionCode) : nullptr));
259+
}
260+
241261
PyObject* PyInstantSupportModule_isSupported(PyInstantSupportModule* self, PyObject* args)
242262
{
243263
(void)args;
@@ -307,6 +327,17 @@ Set SessionDataChangedCallback and RequestInstantSupportErrorCallback to handle
307327
:param str sessionCode: Session code (optional). Will be checked for validity; leave empty to create new session code.
308328
)__");
309329

330+
PyDoc_STRVAR(closeInstantSupportCase,
331+
R"__(closeInstantSupportCase($self, accessToken, sessionCode)
332+
--
333+
334+
Requests an instant support service case close. Parameters are passed as keyword arguments.
335+
Set SessionDataChangedCallback and RequestInstantSupportErrorCallback to handle the result of this request.
336+
337+
:param str accessToken: User or company access token for authentication.
338+
:param str sessionCode: Session code.
339+
)__");
340+
310341
PyDoc_STRVAR(acceptConnectionRequest,
311342
R"__(acceptConnectionRequest($self)
312343
--
@@ -354,6 +385,13 @@ PyMethodDef PyInstantSupportModule_methods[] =
354385
DocStrings::requestInstantSupport
355386
},
356387

388+
{
389+
"closeInstantSupportCase",
390+
WeakConnectionCall<PyInstantSupportModule, PyInstantSupportModule_closeInstantSupportCase>,
391+
METH_O,
392+
DocStrings::closeInstantSupportCase
393+
},
394+
357395
{
358396
"acceptConnectionRequest",
359397
WeakConnectionCall<PyInstantSupportModule, PyInstantSupportModule_acceptConnectionRequest>,
@@ -471,7 +509,9 @@ PyTypeObject* GetPyTypeInstantSupportModule_RequestErrorCode()
471509
{toCString(ErrorCode::InvalidGroup), static_cast<long>(ErrorCode::InvalidGroup)},
472510
{toCString(ErrorCode::InvalidSessionCode), static_cast<long>(ErrorCode::InvalidSessionCode)},
473511
{toCString(ErrorCode::Busy), static_cast<long>(ErrorCode::Busy)},
474-
{toCString(ErrorCode::InvalidEmail), static_cast<long>(ErrorCode::InvalidEmail)}});
512+
{toCString(ErrorCode::InvalidEmail), static_cast<long>(ErrorCode::InvalidEmail)},
513+
{toCString(ErrorCode::CloseRequestFailed), static_cast<long>(ErrorCode::CloseRequestFailed)},
514+
{toCString(ErrorCode::NotFound), static_cast<long>(ErrorCode::NotFound)}});
475515

476516
return result;
477517
}();

Bindings/Python/tests/test_instant_support.py

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -52,58 +52,63 @@
5252
def test_request_reactivate_service_case():
5353
# request instant support without session code
5454
received_session_data = test_instant_support(
55-
request_data=dict(request_data, sessionCode=""),
56-
expected_session_data=expected_session_data
57-
)
55+
request_data=dict(request_data, sessionCode=""),
56+
expected_session_data=expected_session_data
57+
)()
5858

5959
received_session_code=received_session_data['sessionCode']
6060

6161
# request instant support with previously received session code
6262
test_instant_support(
63-
request_data=dict(request_data, sessionCode=received_session_code),
64-
expected_session_data=dict(expected_session_data, sessionCode=received_session_code)
65-
)()
63+
request_data=dict(request_data, sessionCode=received_session_code),
64+
expected_session_data=dict(expected_session_data, sessionCode=received_session_code)
65+
)()
6666

6767

6868
# Test cases
6969
test_cases = {
7070
'test_request_created': test_instant_support(
71-
request_data=request_data,
72-
expected_session_data=expected_session_data
73-
),
71+
request_data=request_data,
72+
expected_session_data=expected_session_data
73+
),
7474
'test_request_created_without_session_code': test_instant_support(
75-
request_data=dict(request_data, sessionCode=""),
76-
expected_session_data=expected_session_data
77-
),
75+
request_data=dict(request_data, sessionCode=""),
76+
expected_session_data=expected_session_data
77+
),
7878
'test_request_reactivate_service_case': test_request_reactivate_service_case,
7979
'test_request_bad_access_token': test_instant_support(
80-
request_data=dict(request_data, accessToken="bad-access-token"),
81-
expected_error_code=tvagentapi.InstantSupportModule.RequestErrorCode.InvalidToken
82-
),
80+
request_data=dict(request_data, accessToken="bad-access-token"),
81+
expected_error_code=tvagentapi.InstantSupportModule.RequestErrorCode.InvalidToken
82+
),
8383
'test_request_bad_email': test_instant_support(
84-
request_data=dict(request_data, email="bad-email"),
85-
expected_error_code=tvagentapi.InstantSupportModule.RequestErrorCode.InvalidEmail
86-
),
84+
request_data=dict(request_data, email="bad-email"),
85+
expected_error_code=tvagentapi.InstantSupportModule.RequestErrorCode.InvalidEmail
86+
),
8787
'test_request_created_without_session_code_change_description': test_instant_support(
88-
request_data=dict(request_data, sessionCode=""),
89-
expected_session_data=dict(expected_session_data, description='No support needed anymore!'),
90-
amend_support_case_data={'description': "No support needed anymore!"},
91-
),
88+
request_data=dict(request_data, sessionCode=""),
89+
expected_session_data=dict(expected_session_data, description='No support needed anymore!'),
90+
amend_support_case_data={'description': "No support needed anymore!"},
91+
),
92+
'test_close_instant_support_service_case': test_instant_support(
93+
request_data=dict(request_data, sessionCode=""),
94+
expected_session_data=expected_session_data,
95+
close_instant_support_case=True
96+
),
9297
# Tests requiring TV client interaction
9398
'test_request_instant_support_response_accept': test_instant_support(
94-
request_data=request_data,
95-
incoming_connection_response=tvagentapi.InstantSupportModule.acceptConnectionRequest
96-
),
99+
request_data=request_data,
100+
incoming_connection_response=tvagentapi.InstantSupportModule.acceptConnectionRequest
101+
),
97102
'test_request_instant_support_response_reject': test_instant_support(
98-
request_data=request_data,
99-
incoming_connection_response=tvagentapi.InstantSupportModule.rejectConnectionRequest
100-
),
103+
request_data=request_data,
104+
incoming_connection_response=tvagentapi.InstantSupportModule.rejectConnectionRequest
105+
),
101106
'test_request_instant_support_response_timeout': test_instant_support(
102-
request_data=request_data,
103-
incoming_connection_response=tvagentapi.InstantSupportModule.timeoutConnectionRequest
104-
)
107+
request_data=request_data,
108+
incoming_connection_response=tvagentapi.InstantSupportModule.timeoutConnectionRequest
109+
)
105110
}
106111

107112
if __name__ == "__main__":
108113
from tvagentapi_test import run_tests_from_args
109-
run_tests_from_args(test_cases)
114+
run_tests_from_args(test_cases)

Bindings/Python/tests/tvagentapi_test/instant_support.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,17 @@
3030
@with_connect_urls
3131
def test_instant_support(request_data=None, expected_session_data=None, expected_error_code=None,
3232
incoming_connection_response=None, amend_support_case_data=None,
33-
base_sdk_url=None, agent_api_url=None):
33+
base_sdk_url=None, agent_api_url=None, close_instant_support_case=False):
3434
"""
3535
Instant Support test helper
3636
3737
Arguments:
38-
request_data -- if not None -> make request. If 'sessionCode' not provided we don't compare it to expected_session_data['sessionCode']
39-
expected_session_data -- if not None -> expect sessionDataChangedCallback callback
40-
expected_error_code -- if not None -> expect requestErrorCallback callback
41-
incoming_connection_response -- if not None -> call response action when supporter connects
42-
amend_support_case_data -- if not None -> change support case data after it is created
38+
request_data -- if not None -> make request. If 'sessionCode' not provided we don't compare it to expected_session_data['sessionCode']
39+
expected_session_data -- if not None -> expect sessionDataChangedCallback callback
40+
expected_error_code -- if not None -> expect requestErrorCallback callback
41+
incoming_connection_response -- if not None -> call response action when supporter connects
42+
amend_support_case_data -- if not None -> change support case data after it is created
43+
close_instant_support_case -- if not False -> close support case
4344
"""
4445
import tvagentapi
4546
from . import get_session, put_session
@@ -83,6 +84,16 @@ def instant_support_connection_requested(is_module):
8384
return
8485
response_success = True
8586

87+
def instant_support_close_case_requested(is_module, r_data, s_data):
88+
nonlocal response_success
89+
try:
90+
is_module.closeInstantSupportCase({"accessToken": r_data['accessToken'],
91+
"sessionCode": s_data['sessionCode']})
92+
except:
93+
response_success = False
94+
return
95+
response_success = True
96+
8697
api = tvagentapi.TVAgentAPI()
8798
connection = api.createAgentConnection(None)
8899
if base_sdk_url and agent_api_url:
@@ -93,7 +104,6 @@ def instant_support_connection_requested(is_module):
93104
sessionDataChangedCallback=instant_support_session_data_changed,
94105
requestErrorCallback=instant_support_request_error,
95106
connectionRequestCallback=lambda: instant_support_connection_requested(instant_support_module))
96-
97107
connection.start()
98108

99109
# wait for session_data or error_code changes
@@ -102,6 +112,9 @@ def instant_support_connection_requested(is_module):
102112
(incoming_connection_response is not None and response_success is None)):
103113
connection.processEvents(True, 100)
104114

115+
if close_instant_support_case and "accessToken" in request_data and session_data is not None:
116+
instant_support_close_case_requested(instant_support_module, request_data, session_data)
117+
105118
connection.stop()
106119
connection.processEvents()
107120

@@ -119,6 +132,9 @@ def instant_support_connection_requested(is_module):
119132
if incoming_connection_response is not None and not response_success:
120133
raise RuntimeError(f"incoming connection response failed")
121134

135+
if close_instant_support_case is not False and not response_success:
136+
raise RuntimeError(f"close instant support request failed")
137+
122138
del connection
123139

124140
reference_error = False

CommunicationLayer/src/Services/Library/export/TVRemoteScreenSDKCommunication/InstantSupportService/InstantSupportError.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ enum class InstantSupportError
3535
InvalidGroup = 2,
3636
InvalidSessionCode = 3,
3737
Busy = 4,
38-
InvalidEmail = 5
38+
InvalidEmail = 5,
39+
CloseRequestFailed = 6,
40+
NotFound = 7,
3941
};
4042

4143
} // namespace InstantSupportService

CommunicationLayer/src/Services/Library/generated/export/TVRemoteScreenSDKCommunication/InstantSupportService/IInstantSupportServiceClient.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ class IInstantSupportServiceClient : public IServiceClient
5252
const std::string& description,
5353
const std::string& sessionCode,
5454
const std::string& email) = 0;
55+
56+
// rpc call CloseInstantSupportCase
57+
virtual CallStatus CloseInstantSupportCase(const std::string& comId,
58+
const std::string& accessToken,
59+
const std::string& sessionCode) = 0;
5560
};
5661

5762
} // namespace InstantSupportService

CommunicationLayer/src/Services/Library/generated/export/TVRemoteScreenSDKCommunication/InstantSupportService/IInstantSupportServiceServer.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,18 @@ class IInstantSupportServiceServer : public IServiceServer
6060
const std::string& email,
6161
const RequestInstantSupportResponseCallback& response)>;
6262
virtual void SetRequestInstantSupportCallback(const ProcessRequestInstantSupportRequestCallback& requestProcessing) = 0;
63+
64+
// rpc call CloseInstantSupportCase
65+
using CloseInstantSupportCaseResponseCallback = std::function<void(
66+
67+
const CallStatus& callStatus)>;
68+
using ProcessCloseInstantSupportCaseRequestCallback = std::function<void(
69+
70+
const std::string& comId,
71+
const std::string& accessToken,
72+
const std::string& sessionCode,
73+
const CloseInstantSupportCaseResponseCallback& response)>;
74+
virtual void SetCloseInstantSupportCaseCallback(const ProcessCloseInstantSupportCaseRequestCallback& requestProcessing) = 0;
6375
};
6476

6577
} // namespace InstantSupportService

CommunicationLayer/src/Services/Library/generated/internal/Client/InstantSupportNotificationServiceSocketIOClient.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,12 @@ auto InstantSupportNotificationServiceSocketIOClient::NotifyInstantSupportError(
105105
case InstantSupportError::InvalidEmail:
106106
errorCodeProtoValue = ::tvinstantsupportservice::ErrorNotificationRequest_ErrorCode_InvalidEmail;
107107
break;
108+
case InstantSupportError::CloseRequestFailed:
109+
errorCodeProtoValue = ::tvinstantsupportservice::ErrorNotificationRequest_ErrorCode_CloseRequestFailed;
110+
break;
111+
case InstantSupportError::NotFound:
112+
errorCodeProtoValue = ::tvinstantsupportservice::ErrorNotificationRequest_ErrorCode_NotFound;
113+
break;
108114
default:
109115

110116
break;

CommunicationLayer/src/Services/Library/generated/internal/Client/InstantSupportNotificationServicegRPCClient.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,12 @@ auto InstantSupportNotificationServicegRPCClient::NotifyInstantSupportError(cons
109109
case InstantSupportError::InvalidEmail:
110110
errorCodeProtoValue = ::tvinstantsupportservice::ErrorNotificationRequest_ErrorCode_InvalidEmail;
111111
break;
112+
case InstantSupportError::CloseRequestFailed:
113+
errorCodeProtoValue = ::tvinstantsupportservice::ErrorNotificationRequest_ErrorCode_CloseRequestFailed;
114+
break;
115+
case InstantSupportError::NotFound:
116+
errorCodeProtoValue = ::tvinstantsupportservice::ErrorNotificationRequest_ErrorCode_NotFound;
117+
break;
112118
default:
113119

114120
break;

CommunicationLayer/src/Services/Library/generated/internal/Client/InstantSupportServiceSocketIOClient.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,47 @@ auto InstantSupportServiceSocketIOClient::RequestInstantSupport(const std::strin
115115
return returnValue;
116116
}
117117

118+
// rpc call CloseInstantSupportCase
119+
auto InstantSupportServiceSocketIOClient::CloseInstantSupportCase(const std::string& comId,
120+
const std::string& accessToken,
121+
const std::string& sessionCode) -> CallStatus
122+
{
123+
CallStatus returnValue{};
124+
125+
if (m_channel == nullptr)
126+
{
127+
returnValue.errorMessage = TvServiceBase::ErrorMessage_MissingStartClient;
128+
return returnValue;
129+
}
130+
131+
if (comId.empty())
132+
{
133+
returnValue.errorMessage = TvServiceBase::ErrorMessage_InvalidInputParameter;
134+
return returnValue;
135+
}
136+
137+
::tvinstantsupportservice::CloseInstantSupportCaseRequest request{};
138+
139+
request.set_accesstoken(accessToken);
140+
141+
request.set_sessioncode(sessionCode);
142+
143+
::tvinstantsupportservice::CloseInstantSupportCaseResponse response{};
144+
145+
Transport::SocketIO::Status status = m_channel->Call(comId, Function_CloseInstantSupportCase, request, response);
146+
147+
if (status.ok())
148+
{
149+
returnValue = CallStatus{CallState::Ok};
150+
}
151+
else
152+
{
153+
returnValue.errorMessage = status.error_message();
154+
}
155+
156+
return returnValue;
157+
}
158+
118159
} // namespace InstantSupportService
119160

120161
} // namespace TVRemoteScreenSDKCommunication

CommunicationLayer/src/Services/Library/generated/internal/Client/InstantSupportServiceSocketIOClient.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,14 @@ class InstantSupportServiceSocketIOClient : public IInstantSupportServiceClient
6666
const std::string& sessionCode,
6767
const std::string& email) override;
6868

69+
// rpc call CloseInstantSupportCase
70+
71+
CallStatus CloseInstantSupportCase(
72+
73+
const std::string& comId,
74+
const std::string& accessToken,
75+
const std::string& sessionCode) override;
76+
6977
private:
7078
std::string m_destination;
7179
std::unique_ptr<TransportFW::ChannelInterface> m_channel;

0 commit comments

Comments
 (0)