void monitorCall(CSTAConnectionID connID, boolean waitForSnapshotConf)
			throws TsapiResourceUnavailableException {
		if ((this.provider.getCapabilities().getMonitorCall() == 0)
				|| (connID == null)) {
			throw new TsapiResourceUnavailableException(0, 0, 0,
					"no capability to monitor call");
		}

		if (this.monitorCrossRefID != 0)
			return;
		CSTAEvent event;
		try {
			event = this.provider.tsapi.monitorCall(connID,
					new CSTAMonitorFilter(), null);
		} catch (TsapiUnableToSendException tue) {
			throw tue;
		} catch (Exception e) {
			log.error("MonitorCall request failed - retrying");
			try {
				event = this.provider.tsapi.monitorCall(connID,
						new CSTAMonitorFilter(), null);
			} catch (TsapiResourceUnavailableException e1) {
				throw e1;
			} catch (Exception e1) {
				throw new TsapiResourceUnavailableException(0, 0, 0,
						"monitor call failure");
			}
		}

		CSTAMonitorConfEvent monitorConf = (CSTAMonitorConfEvent) event
				.getEvent();

		SnapshotCallExtraConfHandler handler = new AddCallMonitorHandler(this,
				monitorConf.getMonitorCrossRefID());
		if (this.needSnapshot) {
			doSnapshot(connID, handler, waitForSnapshotConf);
		} else {
			handler.handleConf(true, null, null);
		}
	}