boolean doSnapshot(CSTAConnectionID connID,
			SnapshotCallExtraConfHandler extraHandler,
			boolean waitForSnapshotConf, int cause) {
		if (!this.needSnapshot) {
			try {
				if (extraHandler != null) {
					extraHandler.handleConf(true, null, null);
				}
			} finally {
				doCallbackSnapshots(null, cause);
			}
			return true;
		}

		if (this.provider.getCapabilities().getSnapshotCallReq() == 0) {
			try {
				if (extraHandler != null) {
					extraHandler.handleConf(false, null, null);
				}
			} finally {
				doCallbackSnapshots(null, cause);
			}
			return false;
		}

		if (!waitForSnapshotConf) {
			synchronized (this.callbackAndTypeVector) {
				if (this.futureAsynchronousSnapshotHandler != null) {
					this.futureAsynchronousSnapshotHandler
							.addExtraHandler(extraHandler);
					return true;
				}
			}

		}

		SnapshotCallConfHandler handler = new SnapshotCallConfHandler(this,
				extraHandler, waitForSnapshotConf);

		synchronized (handler) {
			this.snapshotCallConfPending = true;
			this.provider.tsapi.snapshotCall(connID, null, handler);

			if (waitForSnapshotConf) {
				try {
					handler.wait(TSProviderImpl.TSAPI_RESPONSE_TIME);
				} catch (InterruptedException e) {
				}
				if (!handler.handled) {
					try {
						if (extraHandler != null) {
							extraHandler.handleConf(false, null, null);
						}
					} finally {
						doCallbackSnapshots(null, cause);
					}
					return false;
				}
				return handler.rc;
			}
		}

		return true;
	}