Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cap splitleg #106

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -25,12 +25,12 @@
/**
*
* @author sergey vetyutnev
*
* @author tamas gyorgyey
*/
public enum CAPMessageType {

// Voice
initialDP_Request, connect_Request, releaseCall_Request, eventReportBCSM_Request, requestReportBCSMEvent_Request, continue_Request, activityTest_Request, activityTest_Response, assistRequestInstructions_Request, establishTemporaryConnection_Request, disconnectForwardConnection_Request, disconnectForwardConnectionWithArgument_Request, connectToResource_Request, resetTimer_Request, furnishChargingInformation_Request, applyChargingReport_Request, applyCharging_Request, callInformationReport_Request, callInformationRequest_Request, sendChargingInformation_Request, specializedResourceReport_Request, playAnnouncement_Request, promptAndCollectUserInformation_Request, promptAndCollectUserInformation_Response, cancel_Request, continueWithArgument_Request, collectInformation_Request, callGap_Request, entityReleased_Request, disconnectLeg_Request, disconnectLeg_Response, moveLeg_Request, moveLeg_Response, splitLeg_Request, playTone_Request, initiateCallAttempt_Request, initiateCallAttempt_Response, collectInformationRequest_Request,
initialDP_Request, connect_Request, releaseCall_Request, eventReportBCSM_Request, requestReportBCSMEvent_Request, continue_Request, activityTest_Request, activityTest_Response, assistRequestInstructions_Request, establishTemporaryConnection_Request, disconnectForwardConnection_Request, disconnectForwardConnectionWithArgument_Request, connectToResource_Request, resetTimer_Request, furnishChargingInformation_Request, applyChargingReport_Request, applyCharging_Request, callInformationReport_Request, callInformationRequest_Request, sendChargingInformation_Request, specializedResourceReport_Request, playAnnouncement_Request, promptAndCollectUserInformation_Request, promptAndCollectUserInformation_Response, cancel_Request, continueWithArgument_Request, collectInformation_Request, callGap_Request, entityReleased_Request, disconnectLeg_Request, disconnectLeg_Response, moveLeg_Request, moveLeg_Response, splitLeg_Request, splitLeg_Response, playTone_Request, initiateCallAttempt_Request, initiateCallAttempt_Response, collectInformationRequest_Request,

// GPRS
initialDPGPRS_Request, requestReportGPRSEvent_Request, eventReportGPRS_Request, eventReportGPRS_Response, applyChargingGPRS_Request, applyChargingReportGPRS_Request, applyChargingReportGPRS_Response, entityReleasedGPRS_Request, entityReleasedGPRS_Response, connectGPRS_Request, continueGPRS_Request, releaseGPRS_Request, resetTimerGPRS_Request, furnishChargingInformationGPRS_Request, cancelGPRS_Request, sendChargingInformationGPRS_Request, activityTestGPRS_Request, activityTestGPRS_Response,
Expand Down
Expand Up @@ -349,4 +349,10 @@ Long addMoveLegRequest(int customInvokeTimeout, LegID logIDToMove,

Long addCollectInformationRequest(int customInvokeTimeout) throws CAPException;

Long addSplitLegRequest(LegID legIDToSplit, Integer newCallSegmentId, CAPExtensions extensions) throws CAPException;

Long addSplitLegRequest(int customInvokeTimeout, LegID legIDToSplit, Integer newCallSegmentId,
CAPExtensions extensions) throws CAPException;

void addSplitLegResponse(long invokeId) throws CAPException;
}
Expand Up @@ -97,4 +97,7 @@ public interface CAPServiceCircuitSwitchedCallListener extends CAPServiceListene

void onCollectInformationRequest(CollectInformationRequest ind);

void onSplitLegRequest(SplitLegRequest ind);

void onSplitLegResponse(SplitLegResponse ind);
}
Expand Up @@ -1917,4 +1917,71 @@ public Long addCollectInformationRequest(int customInvokeTimeout) throws CAPExce

return invokeId;
}

public Long addSplitLegRequest(LegID legIDToSplit, Integer newCallSegmentId, CAPExtensions extensions)
throws CAPException {
return addSplitLegRequest(_Timer_Default, legIDToSplit, newCallSegmentId, extensions);
}

public Long addSplitLegRequest(int customInvokeTimeout, LegID legIDToSplit, Integer newCallSegmentId,
CAPExtensions extensions) throws CAPException {
if (this.appCntx != CAPApplicationContext.CapV4_gsmSSF_scfGeneric
&& this.appCntx != CAPApplicationContext.CapV4_scf_gsmSSFGeneric)
throw new CAPException(
"Bad application context for addSplitLegRequest: must be CapV4_gsmSSF_scfGeneric or CapV4_scf_gsmSSFGeneric");

Invoke invoke = this.capProviderImpl.getTCAPProvider().getComponentPrimitiveFactory()
.createTCInvokeRequest(InvokeClass.Class1);
if (customInvokeTimeout == _Timer_Default)
invoke.setTimeout(_Timer_CircuitSwitchedCallControl_Short);
else
invoke.setTimeout(customInvokeTimeout);

OperationCode oc = this.capProviderImpl.getTCAPProvider().getComponentPrimitiveFactory().createOperationCode();
oc.setLocalOperationCode((long) CAPOperationCode.splitLeg);
invoke.setOperationCode(oc);

SplitLegRequestImpl req = new SplitLegRequestImpl(legIDToSplit, newCallSegmentId, extensions);
AsnOutputStream aos = new AsnOutputStream();
req.encodeData(aos);

Parameter p = this.capProviderImpl.getTCAPProvider().getComponentPrimitiveFactory().createParameter();
p.setTagClass(req.getTagClass());
p.setPrimitive(req.getIsPrimitive());
p.setTag(req.getTag());
p.setData(aos.toByteArray());
invoke.setParameter(p);

Long invokeId;
try {
invokeId = this.tcapDialog.getNewInvokeId();
invoke.setInvokeId(invokeId);
} catch (TCAPException e) {
throw new CAPException(e.getMessage(), e);
}

this.sendInvokeComponent(invoke);

return invokeId;
}

public void addSplitLegResponse(long invokeId) throws CAPException {

if (this.appCntx != CAPApplicationContext.CapV4_gsmSSF_scfGeneric
&& this.appCntx != CAPApplicationContext.CapV4_scf_gsmSSFGeneric)
throw new CAPException(
"Bad application context for addSplitLegResponse: must be CapV4_gsmSSF_scfGeneric or CapV4_scf_gsmSSFGeneric");

ReturnResultLast resultLast = this.capProviderImpl.getTCAPProvider().getComponentPrimitiveFactory()
.createTCResultLastRequest();

resultLast.setInvokeId(invokeId);

// Operation Code
OperationCode oc = this.capProviderImpl.getTCAPProvider().getComponentPrimitiveFactory().createOperationCode();
oc.setLocalOperationCode((long) CAPOperationCode.splitLeg);
resultLast.setOperationCode(oc);

this.sendReturnResultLastComponent(resultLast);
}
}
Expand Up @@ -470,13 +470,26 @@ public void processComponent(ComponentType compType, OperationCode oc, Parameter
}
break;

case CAPOperationCode.collectInformation:
if (acn == CAPApplicationContext.CapV4_gsmSSF_scfGeneric || acn == CAPApplicationContext.CapV4_scf_gsmSSFGeneric) {
if (compType == ComponentType.Invoke) {
collectInformationRequest(parameter, capDialogCircuitSwitchedCallImpl, invokeId);
case CAPOperationCode.collectInformation:
if (acn == CAPApplicationContext.CapV4_gsmSSF_scfGeneric || acn == CAPApplicationContext.CapV4_scf_gsmSSFGeneric) {
if (compType == ComponentType.Invoke) {
collectInformationRequest(parameter, capDialogCircuitSwitchedCallImpl, invokeId);
}
}
}
break;
break;

case CAPOperationCode.splitLeg:
if (acn == CAPApplicationContext.CapV4_gsmSSF_scfGeneric
|| acn == CAPApplicationContext.CapV4_scf_gsmSSFGeneric) {

if (compType == ComponentType.Invoke) {
splitLegRequest(parameter, capDialogCircuitSwitchedCallImpl, invokeId);
}
if (compType == ComponentType.ReturnResultLast) {
splitLegResponse(parameter, capDialogCircuitSwitchedCallImpl, invokeId);
}
}
break;

default:
throw new CAPParsingComponentException("", CAPParsingComponentExceptionReason.UnrecognizedOperation);
Expand Down Expand Up @@ -1428,4 +1441,53 @@ private void collectInformationRequest(Parameter parameter, CAPDialogCircuitSwit
}
}
}

private void splitLegRequest(Parameter parameter, CAPDialogCircuitSwitchedCallImpl capDialogImpl, Long invokeId)
throws CAPParsingComponentException {

if (parameter == null)
throw new CAPParsingComponentException(
"Error while decoding splitLegRequest: Parameter is mandatory but not found",
CAPParsingComponentExceptionReason.MistypedParameter);

if (parameter.getTagClass() != Tag.CLASS_UNIVERSAL || parameter.getTag() != Tag.SEQUENCE || parameter.isPrimitive())
throw new CAPParsingComponentException("Error while decoding splitLegRequest: bad tagClass or tag",
CAPParsingComponentExceptionReason.MistypedParameter);

SplitLegRequestImpl ind = new SplitLegRequestImpl();

byte[] buf = parameter.getData();
AsnInputStream ais = new AsnInputStream(buf);
ind.decodeData(ais, buf.length);

ind.setInvokeId(invokeId);
ind.setCAPDialog(capDialogImpl);

for (CAPServiceListener serLis : this.serviceListeners) {
try {
serLis.onCAPMessage(ind);
((CAPServiceCircuitSwitchedCallListener) serLis).onSplitLegRequest(ind);
} catch (Exception e) {
loger.error("Error processing splitLegRequest: " + e.getMessage(), e);
}
}
}

private void splitLegResponse(Parameter parameter, CAPDialogCircuitSwitchedCallImpl capDialogImpl, Long invokeId)
throws CAPParsingComponentException {

SplitLegResponseImpl ind = new SplitLegResponseImpl();

ind.setInvokeId(invokeId);
ind.setCAPDialog(capDialogImpl);

for (CAPServiceListener serLis : this.serviceListeners) {
try {
serLis.onCAPMessage(ind);
((CAPServiceCircuitSwitchedCallListener) serLis).onSplitLegResponse(ind);
} catch (Exception e) {
loger.error("Error processing splitLegResponse: " + e.getMessage(), e);
}
}
}
}