fbsessionhandler.java

来自「Sony Ericsson手机上的Facebook客户端全套代码」· Java 代码 · 共 680 行 · 第 1/2 页

JAVA
680
字号
// Decompiled by Jad v1.5.7g. Copyright 2000 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   FbSessionHandler.java

package com.sonyericsson.fb.api;

import com.sonyericsson.fb.api.data.FbFriendItemData;
import com.sonyericsson.fb.api.data.FbItemDataFactory;
import com.sonyericsson.fb.api.data.FbStatusItemData;
import com.sonyericsson.fb.api.request.FbAPIRequestWorker;
import com.sonyericsson.fb.api.request.FbGetFriendsListRequest;
import com.sonyericsson.fb.api.request.FbGetLoggedInUserRequest;
import com.sonyericsson.fb.api.request.FbGetNewsfeedRequest;
import com.sonyericsson.fb.api.request.FbGetStatusRequest;
import com.sonyericsson.fb.api.request.FbSessionStartRequest;
import com.sonyericsson.fb.api.request.IFbAPIRequest;
import com.sonyericsson.fb.api.request.IFbAPIRequestListener;
import com.sonyericsson.fb.utils.*;
import java.security.*;
import java.util.*;
import javax.microedition.rms.*;
import se.southend.drops.screen.ScreenEngine;

// Referenced classes of package com.sonyericsson.fb.api:
//            IFbSessionHandlerStateListener, InvalidStateException, IFbStatusListener, FbDefines

public class FbSessionHandler
    implements IFbAPIRequestListener
{

    public static FbSessionHandler getInstance()
    {
        if(_instance == null)
            _instance = new FbSessionHandler();
        return _instance;
    }

    private FbSessionHandler()
    {
        _serverTimeStamp = -1L;
        _state = 0;
        _expires = 0;
        _login = "";
        _password = "";
        _storeSession = false;
        _sessionKey = "";
        _sessionSecret = "";
        _uid = "";
        _observers = new Vector();
        _statusListeners = new Vector();
        _friends = new Hashtable();
        _newsFeed = null;
        _currentRequest = null;
        _dataLock = new Object();
        _observerLock = new Object();
        _statusLock = new Object();
        _recordStoreLock = new Object();
        isRecordStoreOwner = !ScreenEngine.getInstance().isRunningOnHomescreen();
        loadSession();
    }

    public boolean hasStoredSession()
    {
        return _sessionKey.length() > 0 && _sessionSecret.length() > 0 && _uid.length() > 0;
    }

    public void addObeserver(IFbSessionHandlerStateListener listener)
    {
        synchronized(_observerLock)
        {
            removeObserver(listener);
            _observers.addElement(listener);
        }
    }

    public void removeObserver(IFbSessionHandlerStateListener listener)
    {
        synchronized(_observerLock)
        {
            int i = 0;
            do
            {
                if(i >= _observers.size())
                    break;
                if(_observers.elementAt(i) == listener)
                {
                    _observers.removeElementAt(i);
                    break;
                }
                i++;
            } while(true);
        }
    }

    public void addStatusListener(IFbStatusListener listener)
    {
        synchronized(_statusLock)
        {
            removeStatusListener(listener);
            _statusListeners.addElement(listener);
        }
    }

    public void removeStatusListener(IFbStatusListener listener)
    {
        synchronized(_statusLock)
        {
            int i = 0;
            do
            {
                if(i >= _statusListeners.size())
                    break;
                if(_statusListeners.elementAt(i) == listener)
                {
                    _statusListeners.removeElementAt(i);
                    break;
                }
                i++;
            } while(true);
        }
    }

    public boolean isConnected()
    {
        boolean connected = false;
        synchronized(_dataLock)
        {
            connected = _state == 4;
        }
        return connected;
    }

    public void setConnected(String uid, String sessionkey, String sessionsecret)
    {
        synchronized(_dataLock)
        {
            if(_state == 0)
            {
                _sessionKey = sessionkey;
                _sessionSecret = sessionsecret;
                _uid = uid;
                _currentRequest = new FbGetLoggedInUserRequest(this);
                setState(3);
                FbAPIRequestWorker.getInstance().addAPIRequest(_currentRequest);
            }
        }
    }

    private void setState(int state)
    {
        int oldState = 0;
        synchronized(_dataLock)
        {
            if(state == 0)
            {
                _expires = 0;
                _password = "";
                _sessionKey = "";
                _sessionSecret = "";
                _storeSession = false;
                _uid = "";
                _user = null;
                _friends.clear();
                _newsFeed.removeAllElements();
                _login = "";
            }
            oldState = _state;
            _state = state;
        }
        synchronized(_observerLock)
        {
            for(int i = 0; i < _observers.size(); i++)
            {
                IFbSessionHandlerStateListener listener = (IFbSessionHandlerStateListener)_observers.elementAt(i);
                if(!listener.FbSessionStateChanged(_state, oldState))
                {
                    _observers.removeElementAt(i);
                    i--;
                }
            }

        }
    }

    public void startSession(String user, String password, boolean storeSession)
        throws InvalidStateException
    {
        if(_state == 0 || _state == 6)
        {
            setState(1);
            processStartSession();
            synchronized(_dataLock)
            {
                _login = user;
                _password = password;
                _storeSession = storeSession;
                _currentRequest = new FbSessionStartRequest(_login, _password, this);
            }
            FbAPIRequestWorker.getInstance().addAPIRequest(_currentRequest);
        } else
        {
            throw new InvalidStateException("Required state for action was FB_SESSION_NOT_CONNECTED but it was " + getStateString(_state));
        }
    }

    public boolean startStoredSession()
        throws InvalidStateException
    {
        if(!hasStoredSession())
            return false;
        if(_state == 0)
        {
            synchronized(_dataLock)
            {
                _currentRequest = new FbGetLoggedInUserRequest(this);
            }
            setState(3);
            FbAPIRequestWorker.getInstance().addAPIRequest(_currentRequest);
        } else
        {
            throw new InvalidStateException("Required state for action was FB_SESSION_NOT_CONNECTED but it was " + getStateString(_state));
        }
        return true;
    }

    public synchronized String calculateSignature(Hashtable parameterTable, String secretKey)
    {
        String result = new String("");
        if(parameterTable.size() == 0)
            return result;
        StringVector parameterList = new StringVector();
        String key;
        String value;
        for(Enumeration e = parameterTable.keys(); e.hasMoreElements(); parameterList.addElement(key + "=" + value))
        {
            key = (String)e.nextElement();
            value = (String)parameterTable.get(key);
        }

        parameterList.sort();
        String str = new String("");
        for(int i = 0; i < parameterList.size(); i++)
            str = str + parameterList.elementAt(i);

        str = str + secretKey;
        MessageDigest md5 = null;
        try
        {
            md5 = MessageDigest.getInstance("MD5");
        }
        catch(NoSuchAlgorithmException e)
        {
            Logger.printErrorln("Could not find the requested message digest method: " + e.toString());
            return result;
        }
        md5.update(str.getBytes(), 0, str.length());
        byte hash[] = new byte[str.length()];
        int hashSize = 0;
        try
        {
            hashSize = md5.digest(hash, 0, hash.length);
        }
        catch(DigestException e)
        {
            Logger.printErrorln("Could not digest message: " + e.toString());
        }
        if(hashSize > 0)
            result = Utilities.toHexString(hash, 0, hashSize);
        return result;
    }

    public synchronized String createDeepLink(String url)
        throws InvalidStateException
    {
        String result = new String("");
        Hashtable parameters = new Hashtable();
        parameters.put("api_key", "cab9b0c2b22b9628e5d4966412f1c1a1");
        parameters.put("t", String.valueOf(System.currentTimeMillis() / 1000L));
        parameters.put("uid", getUid());
        parameters.put("url", url);
        String signature = calculateSignature(parameters, "4c2ba82712e7fc831c0ad4f9865922ae");
        parameters.put("sig", signature);
        result = "http://m.facebook.com/auth.php?api_key=" + parameters.get("api_key").toString() + "&t=" + parameters.get("t").toString() + "&uid=" + parameters.get("uid").toString() + "&url=" + Utilities.encodeUrl(parameters.get("url").toString()) + "&sig=" + parameters.get("sig").toString();
        Logger.println("FbSessionHandler.createDeepLink(): Created deeplink - " + result);
        return result;
    }

    private void processStartSession()
    {
        _uid = "";
        _sessionKey = "";
        _sessionSecret = "";
        _expires = 0;
        storeSession();
    }

    private void loadSession()
    {
        synchronized(_dataLock)
        {
            _uid = "";
            _sessionKey = "";
            _sessionSecret = "";
            _expires = 0;
        }
        synchronized(_recordStoreLock)
        {
            try
            {
                FbRecordStore recordStore = new FbRecordStore();
                recordStore.open(isRecordStoreOwner);
                _uid = recordStore.getUid();
                _sessionKey = recordStore.getSessionKey();
                _sessionSecret = recordStore.getSessionSecret();
                _expires = recordStore.getExpiry();
                recordStore.close();
            }
            catch(RecordStoreFullException exception)
            {
                Logger.printErrorln("Record store is full! " + exception.toString());
            }
            catch(RecordStoreNotFoundException exception)
            {
                Logger.printErrorln("Record store could not be found! " + exception.toString());
            }
            catch(RecordStoreException exception)
            {
                Logger.printErrorln("Record store generated an exception! " + exception.toString());
            }
        }
    }

    private void storeSession()
    {
        synchronized(_recordStoreLock)
        {
            try
            {
                FbRecordStore sessionStore = new FbRecordStore();

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?