blob: 17ae93e426578d6b8ec18f6a899fe66dad09048d [file] [log] [blame]
/*
* Copyright (C) 2007 Esmertec AG.
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.im.imps;
import com.android.im.engine.ImErrorInfo;
abstract class AsyncTransaction extends ImpsTransaction {
private final AsyncCompletion mCompletionCallback;
private boolean mCompletionNotified;
protected final ImpsTransactionManager mTransManager;
AsyncTransaction(ImpsTransactionManager manager) {
this(manager, null);
}
AsyncTransaction(ImpsTransactionManager manager, AsyncCompletion completion) {
mTransManager = manager;
mCompletionCallback = completion;
manager.beginClientTransaction(this);
}
/**
* Sends a request within this transaction.
*
* @param request the request to send.
*/
public void sendRequest(Primitive request) {
sendPrimitive(request);
}
/**
* Notify that an error occurs in the transaction.
*
* @param error the error
*/
final void notifyError(ImErrorInfo error) {
notifyErrorResponse(new ImpsErrorInfo(error.getCode(), error.getDescription(), null));
}
/**
* Notify that a response from the server has arrived.
*
* @param response the response.
*/
final void notifyResponse(Primitive response) {
response.setTransaction(this);
ImpsErrorInfo error = ImpsUtils.checkResultError(response);
if (error != null) {
notifyErrorResponse(error);
} else {
notifySuccessResponse(response);
}
}
protected void notifyErrorResponse(ImpsErrorInfo error) {
onResponseError(error);
mTransManager.endClientTransaction(this);
notifyAsyncCompletionError(error);
}
protected void notifySuccessResponse(Primitive response) {
onResponseOk(response);
mTransManager.endClientTransaction(this);
notifyAsyncCompletionSuccess();
}
public abstract void onResponseError(ImpsErrorInfo error);
public abstract void onResponseOk(Primitive response);
protected void notifyAsyncCompletionError(ImErrorInfo error) {
if (!mCompletionNotified) {
mCompletionNotified = true;
if (mCompletionCallback != null)
mCompletionCallback.onError(error);
}
}
protected void notifyAsyncCompletionSuccess() {
if (!mCompletionNotified) {
mCompletionNotified = true;
if (mCompletionCallback != null)
mCompletionCallback.onComplete();
}
}
}