package com.rapidftr.services; import java.util.Hashtable; import net.rim.blackberry.api.phone.Phone; import net.rim.device.api.system.GPRSInfo; import com.rapidftr.net.HttpService; import com.rapidftr.utilities.HttpUtility; import com.sun.me.web.path.ResultException; import com.sun.me.web.request.Arg; import com.sun.me.web.request.Response; public class LoginService extends RequestAwareService { private LoginSettings settings; private static final String USER_NAME = "user_name"; private static final String PASSWORD = "password"; private static final String IMEI = "imei"; private static final String MOBILE_NUMBER = "mobile_number"; public LoginService(HttpService httpService, LoginSettings settings) { super(httpService); this.settings = settings; } public void login(String user, String password) { String imei = GPRSInfo.imeiToString(GPRSInfo.getIMEI()); String mobile = Phone.getDevicePhoneNumber(false); Arg[] postArgs = new Arg[]{new Arg(USER_NAME, user), new Arg(PASSWORD, password), new Arg(IMEI, imei), new Arg(MOBILE_NUMBER, mobile)}; Hashtable context = new Hashtable(); context.put(USER_NAME, user); context.put(PASSWORD, password); requestHandler.startNewProcess(); requestHandler.post("sessions", postArgs, HttpUtility.makeJSONHeader(), null, context); } private String parseAuthorizationToken(Response response) { try { return response.getResult().getAsString("session.token"); } catch (ResultException e) { throw new ServiceException( "JSON returned from login service in unexpected format"); } } public void clearLoginState() { settings.clear(); } public void onRequestSuccess(Object context, Response result) { String user = getUserFromContext((Hashtable) context); settings.authenticate(user, parseAuthorizationToken(result)); settings.setLastUsedUserName(user); settings.setLastUsedPassword(getPasswordFromContext((Hashtable) context)); } public void onRequestFailure(Object context, Exception exception) { requestHandler.markProcessFailed(" Login Failed Due to " + exception.getMessage() + ". "); } private String getUserFromContext(Hashtable table) { return (String) table.get(USER_NAME); } private String getPasswordFromContext(Hashtable table) { return (String) table.get(PASSWORD); } public boolean offlineLogin(String user, String password) { if (settings.allowOfflineLogin(user, password)) { settings.authenticate(user, settings.getAuthorizationTokenForOfflineLogin()); settings.setAuthorisationTokenForOfflineLogin(""); return true; } return false; } }