blob: 12f9f1dcfcf3561490b58ca5687547d149b13a1e [file] [log] [blame]
/*
* Copyright (C) 2008 Esmertec AG.
* Copyright (C) 2008 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 android.util.Log;
import com.android.im.engine.ImErrorInfo;
import com.android.im.engine.ImException;
import com.android.im.engine.SmsService;
import com.android.im.engine.SystemService;
import com.android.im.engine.SmsService.SmsListener;
import com.android.im.engine.SmsService.SmsSendFailureCallback;
import com.android.internal.telephony.EncodeException;
import com.android.internal.telephony.GsmAlphabet;
public class SmsCirChannel extends CirChannel
implements SmsListener, SmsSendFailureCallback {
private String mAddr;
private int mPort;
private SmsService mSmsService;
protected SmsCirChannel(ImpsConnection connection) {
super(connection);
ImpsConnectionConfig cfg = connection.getConfig();
mAddr = cfg.getSmsCirAddr();
mPort = cfg.getSmsCirPort();
}
@Override
public void connect() throws ImException {
mSmsService = SystemService.getDefault().getSmsService();
if (mAddr != null) {
mSmsService.addSmsListener(mAddr, mPort, this);
sendHelo();
} else {
mSmsService.addSmsListener(SmsService.ANY_ADDRESS, mPort, this);
}
}
public boolean isShutdown() {
return false;
}
@Override
public void shutdown() {
mSmsService.removeSmsListener(this);
}
public void onIncomingSms(byte[] data) {
// It's safe to assume that each character is encoded into 7-bit since
// all characters in CIR are in gsm 7-bit alphabet.
int lengthSeptets = data.length * 8 / 7;
String s = GsmAlphabet.gsm7BitPackedToString(data, 0,
lengthSeptets, 0);
// CIR format: WVCI <version> <session cookie>
if (!s.startsWith("WVCI")) {
// not a valid CIR, ignore.
Log.w("SmsCir", "Received a non-CIR SMS, ignore!");
return;
}
String sessionCookie = mConnection.getSession().getCookie();
String[] fields = s.split(" ");
if (fields.length != 3 || !sessionCookie.equalsIgnoreCase(fields[2])) {
// Not a valid CIR, ignore
Log.w("SmsCir", "The CIR format is not correct or session cookie" +
" does not match");
}
mConnection.sendPollingRequest();
}
public void onFailure(int errorCode) {
mConnection.shutdownOnError(new ImErrorInfo(ImpsErrorInfo.NETWORK_ERROR,
"Could not establish SMS CIR channel"));
}
private void sendHelo() {
String data = "HELO " + mConnection.getSession().getID();
try {
byte[] bytes = GsmAlphabet.stringToGsm7BitPacked(data);
mSmsService.sendSms(mAddr, mPort, bytes, this);
} catch (EncodeException ignore) {
}
}
}