Package blackberry.pim.contact

Source Code of blackberry.pim.contact.ContactObject$ContactRemoveScriptableFunction

/*
* Copyright 2010-2011 Research In Motion Limited.
*
* 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 blackberry.pim.contact;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Date;

import javax.microedition.pim.Contact;
import javax.microedition.pim.ContactList;
import javax.microedition.pim.FieldFullException;
import javax.microedition.pim.PIM;
import javax.microedition.pim.PIMException;
import javax.microedition.pim.PIMItem;
import javax.microedition.pim.UnsupportedFieldException;

import net.rim.blackberry.api.pdap.BlackBerryContact;
import net.rim.blackberry.api.pdap.BlackBerryPIM;
import net.rim.device.api.io.Base64OutputStream;
import blackberry.core.Blob;
import blackberry.core.FunctionSignature;
import blackberry.core.ScriptField;
import blackberry.core.ScriptableFunctionBase;
import blackberry.core.ScriptableObjectBase;
import blackberry.identity.service.ServiceObject;
import blackberry.pim.address.AddressObject;
import blackberry.pim.category.CategoryNamespace;

/**
* Implementation of the pim Contact
*
* @author dmateescu
*/
public class ContactObject extends ScriptableObjectBase {
    private Contact _contact;
    private String _serviceName;

    private ContactSaveScriptableFunction _save;
    private ContactRemoveScriptableFunction _remove;
    private ContactSetPictureScriptableFunction _setPicture;

    public static final String FIELD_TITLE = "title";
    public static final String FIELD_FIRSTNAME = "firstName";
    public static final String FIELD_LASTNAME = "lastName";
    public static final String FIELD_HOMEADDRESS = "homeAddress";
    public static final String FIELD_WORKADDRESS = "workAddress";
    public static final String FIELD_EMAIL1 = "email1";
    public static final String FIELD_EMAIL2 = "email2";
    public static final String FIELD_EMAIL3 = "email3";
    public static final String FIELD_COMPANY = "company";
    public static final String FIELD_JOBTITLE = "jobTitle";
    public static final String FIELD_HOMEPHONE = "homePhone";
    public static final String FIELD_HOMEPHONE2 = "homePhone2";
    public static final String FIELD_WORKPHONE = "workPhone";
    public static final String FIELD_WORKPHONE2 = "workPhone2";
    public static final String FIELD_MOBILEPHONE = "mobilePhone";
    public static final String FIELD_MOBILEPHONE2 = "mobilePhone2";
    public static final String FIELD_FAXPHONE = "faxPhone";
    public static final String FIELD_FAXPHONE2 = "faxPhone2";
    public static final String FIELD_PAGERPHONE = "pagerPhone";
    public static final String FIELD_OTHERPHONE = "otherPhone";
    public static final String FIELD_NOTE = "note";
    public static final String FIELD_WEBPAGE = "webpage";
    public static final String FIELD_BIRTHDAY = "birthday";
    public static final String FIELD_ANNIVERSARY = "anniversary";
    public static final String FIELD_USER1 = "user1";
    public static final String FIELD_USER2 = "user2";
    public static final String FIELD_USER3 = "user3";
    public static final String FIELD_USER4 = "user4";
    public static final String FIELD_PIN = "pin";
    public static final String FIELD_UID = "uid";
    public static final String FIELD_PICTURE = "picture";
    public static final String FIELD_CATEGORIES = "categories";

    public static final String METHOD_SAVE = "save";
    public static final String METHOD_REMOVE = "remove";
    public static final String METHOD_SETPICTURE = "setPicture";

    private static final String PICTURE_ENCODING = "UTF-8";

    /**
     * Default constructor of the Contact
     */
    public ContactObject() {
        super();
        _contact = null;
        _serviceName = "";
        initial();
    }

    /**
     * Constructs a Contact object based on a given javax.microedition.pim.Contact
     *
     * @param c
     *            the javax.microedition.pim.Contact
     */
    public ContactObject( Contact c ) {
        super();
        _contact = c;
        _serviceName = "";
        initial();
    }

    /**
     * Constructs a Contact object based on a ServiceObject
     *
     * @param s
     *            the ServiceObject
     */
    public ContactObject( ServiceObject s ) {
        super();
        _contact = null;
        _serviceName = s.getName();
        initial();
    }

    /**
     * Constructs a Contact object based on a given javax.microedition.pim.Contact and a given ServiceObject
     *
     * @param c
     *            the javax.microedition.pim.Contact
     * @param s
     *            the ServiceObject
     */
    public ContactObject( Contact c, ServiceObject s ) {
        super();
        _contact = c;
        _serviceName = s.getName();
        initial();
    }

    /**
     * This class implements the save method of a Contact
     *
     */
    public class ContactSaveScriptableFunction extends ScriptableFunctionBase {
        private final ContactObject _outer;

        /**
         * Default constructor of a ContactSaveScriptableFunction
         */
        public ContactSaveScriptableFunction() {
            super();
            _outer = ContactObject.this;
        }

        /**
         * This method updates the contact when save has been triggered
         *
         * @throws Exception
         */

        public void update() throws Exception {
            int nameArraySize;
            int addressArraySize;
            // open the handheld contacts database
            // receive nameArraySize and addressArraySize

            ContactList contactList;
            if( _serviceName.length() == 0 ) {
                contactList = (ContactList) BlackBerryPIM.getInstance().openPIMList( PIM.CONTACT_LIST, PIM.READ_WRITE );
            } else {
                contactList = (ContactList) BlackBerryPIM.getInstance().openPIMList( PIM.CONTACT_LIST, PIM.READ_WRITE,
                        _serviceName );
            }
            nameArraySize = contactList.stringArraySize( Contact.NAME );
            addressArraySize = contactList.stringArraySize( Contact.ADDR );

            if( _contact == null ) {
                _contact = (Contact) contactList.createContact();
            }

            // name & title
            String[] name = new String[ nameArraySize ];
            name[ Contact.NAME_GIVEN ] = _outer.getItem( ContactObject.FIELD_FIRSTNAME ).getStringValue();
            name[ Contact.NAME_FAMILY ] = _outer.getItem( ContactObject.FIELD_LASTNAME ).getStringValue();
            name[ Contact.NAME_PREFIX ] = _outer.getItem( ContactObject.FIELD_TITLE ).getStringValue();
            if( _contact.countValues( Contact.NAME ) == 0 ) {
                if( name[ Contact.NAME_GIVEN ].length() > 0 || name[ Contact.NAME_FAMILY ].length() > 0
                        || name[ Contact.NAME_PREFIX ].length() > 0 ) {
                    _contact.addStringArray( Contact.NAME, Contact.ATTR_NONE, name );
                }
            } else {
                if( name[ Contact.NAME_GIVEN ].length() > 0 || name[ Contact.NAME_FAMILY ].length() > 0
                        || name[ Contact.NAME_PREFIX ].length() > 0 ) {
                    _contact.setStringArray( Contact.NAME, 0, Contact.ATTR_NONE, name );
                } else {
                    // remove old values
                    _contact.removeValue( Contact.NAME, 0 );
                }
            }

            // homeAddress && workAddress
            Object o;
            o = _outer.getItem( ContactObject.FIELD_HOMEADDRESS ).getValue();
            if( o == null ) {
                String[] address = new String[ addressArraySize ];
                address[ Contact.ADDR_STREET ] = "";
                address[ Contact.ADDR_LOCALITY ] = "";
                address[ Contact.ADDR_REGION ] = "";
                address[ Contact.ADDR_POSTALCODE ] = "";
                address[ Contact.ADDR_COUNTRY ] = "";
                address[ Contact.ADDR_EXTRA ] = "";
                setAddress( _contact, Contact.ATTR_HOME, address );
            } else if( o instanceof AddressObject ) {
                AddressObject addressScriptable = (AddressObject) o;

                String[] addressHome = new String[ addressArraySize ];
                addressHome[ Contact.ADDR_STREET ] = addressScriptable.getItem( AddressObject.FIELD_ADDRESS1 ).getStringValue();
                addressHome[ Contact.ADDR_LOCALITY ] = addressScriptable.getItem( AddressObject.FIELD_CITY ).getStringValue();
                addressHome[ Contact.ADDR_REGION ] = addressScriptable.getItem( AddressObject.FIELD_STATE ).getStringValue();
                addressHome[ Contact.ADDR_POSTALCODE ] = addressScriptable.getItem( AddressObject.FIELD_ZIP ).getStringValue();
                addressHome[ Contact.ADDR_COUNTRY ] = addressScriptable.getItem( AddressObject.FIELD_COUNTRY ).getStringValue();
                addressHome[ Contact.ADDR_EXTRA ] = addressScriptable.getItem( AddressObject.FIELD_ADDRESS2 ).getStringValue();
                setAddress( _contact, Contact.ATTR_HOME, addressHome );
            }

            o = _outer.getItem( ContactObject.FIELD_WORKADDRESS ).getValue();
            if( o == null ) {
                String[] address = new String[ addressArraySize ];
                address[ Contact.ADDR_STREET ] = "";
                address[ Contact.ADDR_LOCALITY ] = "";
                address[ Contact.ADDR_REGION ] = "";
                address[ Contact.ADDR_POSTALCODE ] = "";
                address[ Contact.ADDR_COUNTRY ] = "";
                address[ Contact.ADDR_EXTRA ] = "";
                setAddress( _contact, Contact.ATTR_WORK, address );
            } else if( o instanceof AddressObject ) {
                AddressObject addressScriptable = (AddressObject) o;

                String[] addressWork = new String[ addressArraySize ];
                addressWork[ Contact.ADDR_STREET ] = addressScriptable.getItem( AddressObject.FIELD_ADDRESS1 ).getStringValue();
                addressWork[ Contact.ADDR_LOCALITY ] = addressScriptable.getItem( AddressObject.FIELD_CITY ).getStringValue();
                addressWork[ Contact.ADDR_REGION ] = addressScriptable.getItem( AddressObject.FIELD_STATE ).getStringValue();
                addressWork[ Contact.ADDR_POSTALCODE ] = addressScriptable.getItem( AddressObject.FIELD_ZIP ).getStringValue();
                addressWork[ Contact.ADDR_COUNTRY ] = addressScriptable.getItem( AddressObject.FIELD_COUNTRY ).getStringValue();
                addressWork[ Contact.ADDR_EXTRA ] = addressScriptable.getItem( AddressObject.FIELD_ADDRESS2 ).getStringValue();
                setAddress( _contact, Contact.ATTR_WORK, addressWork );
            }

            // email
            int countEmail = _contact.countValues( Contact.EMAIL );
            for( int j = 0; j < countEmail; j++ ) {
                _contact.removeValue( Contact.EMAIL, 0 );
            }

            countEmail = 0;
            String[] emails = new String[ 3 ];
            String email;

            email = _outer.getItem( ContactObject.FIELD_EMAIL1 ).getStringValue();
            if( email != null && email.length() > 0 ) {
                emails[ countEmail++ ] = email;
            }

            email = _outer.getItem( ContactObject.FIELD_EMAIL2 ).getStringValue();
            if( email != null && email.length() > 0 ) {
                emails[ countEmail++ ] = email;
            }

            email = _outer.getItem( ContactObject.FIELD_EMAIL3 ).getStringValue();
            if( email != null && email.length() > 0 ) {
                emails[ countEmail++ ] = email;
            }

            // reset email
            _outer.getItem( ContactObject.FIELD_EMAIL1 ).setValue( "" );
            _outer.getItem( ContactObject.FIELD_EMAIL2 ).setValue( "" );
            _outer.getItem( ContactObject.FIELD_EMAIL3 ).setValue( "" );

            for( int j = 0; j < countEmail; j++ ) {
                _contact.addString( Contact.EMAIL, PIMItem.ATTR_NONE, emails[ j ] );
                if( j == 0 ) {
                    _outer.getItem( ContactObject.FIELD_EMAIL1 ).setValue( emails[ j ] );
                } else if( j == 1 ) {
                    _outer.getItem( ContactObject.FIELD_EMAIL2 ).setValue( emails[ j ] );
                } else if( j == 2 ) {
                    _outer.getItem( ContactObject.FIELD_EMAIL3 ).setValue( emails[ j ] );
                }
            }

            // company
            String value;
            value = _outer.getItem( ContactObject.FIELD_COMPANY ).getStringValue();
            if( _contact.countValues( Contact.ORG ) == 0 ) {
                if( value.length() > 0 ) {
                    _contact.addString( Contact.ORG, PIMItem.ATTR_NONE, value );
                }
            } else {
                if( value.length() > 0 ) {
                    _contact.setString( Contact.ORG, 0, PIMItem.ATTR_NONE, value );
                } else {
                    _contact.removeValue( Contact.ORG, 0 );
                }
            }

            // jobtitle
            value = _outer.getItem( ContactObject.FIELD_JOBTITLE ).getStringValue();
            if( _contact.countValues( Contact.TITLE ) == 0 ) {
                if( value.length() > 0 ) {
                    _contact.addString( Contact.TITLE, PIMItem.ATTR_NONE, value );
                }
            } else {
                if( value.length() > 0 ) {
                    _contact.setString( Contact.TITLE, 0, PIMItem.ATTR_NONE, value );
                } else {
                    _contact.removeValue( Contact.TITLE, 0 );
                }
            }

            // telephone numbers
            setTelephone( _contact, Contact.ATTR_HOME, _outer.getItem( ContactObject.FIELD_HOMEPHONE ).getStringValue() );
            setTelephone( _contact, BlackBerryContact.ATTR_HOME2, _outer.getItem( ContactObject.FIELD_HOMEPHONE2 )
                    .getStringValue() );
            setTelephone( _contact, Contact.ATTR_WORK, _outer.getItem( ContactObject.FIELD_WORKPHONE ).getStringValue() );
            setTelephone( _contact, BlackBerryContact.ATTR_WORK2, _outer.getItem( ContactObject.FIELD_WORKPHONE2 )
                    .getStringValue() );
            setTelephone( _contact, Contact.ATTR_MOBILE, _outer.getItem( ContactObject.FIELD_MOBILEPHONE ).getStringValue() );
            // setTelephone(_contact, BlackBerryContact.ATTR_MOBILE2,
            // _outer.getItem(ContactObject.FIELD_MOBILEPHONE2).getStringValue());
            setTelephone( _contact, Contact.ATTR_FAX, _outer.getItem( ContactObject.FIELD_FAXPHONE ).getStringValue() );
            // setTelephone(_contact, BlackBerryContact.ATTR_FAX2,
            // _outer.getItem(ContactObject.FIELD_FAXPHONE2).getStringValue());
            setTelephone( _contact, Contact.ATTR_PAGER, _outer.getItem( ContactObject.FIELD_PAGERPHONE ).getStringValue() );
            setTelephone( _contact, Contact.ATTR_OTHER, _outer.getItem( ContactObject.FIELD_OTHERPHONE ).getStringValue() );

            // note
            value = _outer.getItem( ContactObject.FIELD_NOTE ).getStringValue();
            if( _contact.countValues( Contact.NOTE ) == 0 ) {
                if( value.length() > 0 ) {
                    _contact.addString( Contact.NOTE, PIMItem.ATTR_NONE, value );
                }
            } else {
                if( value.length() > 0 ) {
                    _contact.setString( Contact.NOTE, 0, PIMItem.ATTR_NONE, value );
                } else {
                    _contact.removeValue( Contact.NOTE, 0 );
                }
            }

            // webpage
            value = _outer.getItem( ContactObject.FIELD_WEBPAGE ).getStringValue();
            try {
                if( _contact.countValues( Contact.URL ) == 0 ) {
                    if( value.length() > 0 ) {
                        _contact.addString( Contact.URL, PIMItem.ATTR_NONE, value );
                    }
                } else {
                    if( value.length() > 0 ) {
                        _contact.setString( Contact.URL, 0, PIMItem.ATTR_NONE, value );
                    } else {
                        _contact.removeValue( Contact.URL, 0 );
                    }
                }
            } catch( UnsupportedFieldException e ) {
                throw new Exception( "\"webpage\" is not a supported property of Contact" );
            }

            // birthday & anniversary
            Date d = (Date) _outer.getItem( ContactObject.FIELD_BIRTHDAY ).getValue();
            if( _contact.countValues( Contact.BIRTHDAY ) == 0 ) {
                if( d != null ) {
                    _contact.addDate( Contact.BIRTHDAY, PIMItem.ATTR_NONE, d.getTime() );
                }
            } else {
                if( d != null ) {
                    _contact.setDate( Contact.BIRTHDAY, 0, PIMItem.ATTR_NONE, d.getTime() );
                } else {
                    _contact.removeValue( Contact.BIRTHDAY, 0 );
                }
            }

            d = (Date) _outer.getItem( ContactObject.FIELD_ANNIVERSARY ).getValue();
            if( _contact.countValues( BlackBerryContact.ANNIVERSARY ) == 0 ) {
                if( d != null ) {
                    _contact.addDate( BlackBerryContact.ANNIVERSARY, PIMItem.ATTR_NONE, d.getTime() );
                }
            } else {
                if( d != null ) {
                    _contact.setDate( BlackBerryContact.ANNIVERSARY, 0, PIMItem.ATTR_NONE, d.getTime() );
                } else {
                    _contact.removeValue( BlackBerryContact.ANNIVERSARY, 0 );
                }
            }

            // user
            value = _outer.getItem( ContactObject.FIELD_USER1 ).getStringValue();
            if( _contact.countValues( BlackBerryContact.USER1 ) == 0 ) {
                if( value.length() > 0 ) {
                    _contact.addString( BlackBerryContact.USER1, PIMItem.ATTR_NONE, value );
                }
            } else {
                if( value.length() > 0 ) {
                    _contact.setString( BlackBerryContact.USER1, 0, PIMItem.ATTR_NONE, value );
                } else {
                    _contact.removeValue( BlackBerryContact.USER1, 0 );
                }
            }

            value = _outer.getItem( ContactObject.FIELD_USER2 ).getStringValue();
            if( _contact.countValues( BlackBerryContact.USER2 ) == 0 ) {
                if( value.length() > 0 ) {
                    _contact.addString( BlackBerryContact.USER2, PIMItem.ATTR_NONE, value );
                }
            } else {
                if( value.length() > 0 ) {
                    _contact.setString( BlackBerryContact.USER2, 0, PIMItem.ATTR_NONE, value );
                } else {
                    _contact.removeValue( BlackBerryContact.USER2, 0 );
                }
            }

            value = _outer.getItem( ContactObject.FIELD_USER3 ).getStringValue();
            if( _contact.countValues( BlackBerryContact.USER3 ) == 0 ) {
                if( value.length() > 0 ) {
                    _contact.addString( BlackBerryContact.USER3, PIMItem.ATTR_NONE, value );
                }
            } else {
                if( value.length() > 0 ) {
                    _contact.setString( BlackBerryContact.USER3, 0, PIMItem.ATTR_NONE, value );
                } else {
                    _contact.removeValue( BlackBerryContact.USER3, 0 );
                }
            }

            value = _outer.getItem( ContactObject.FIELD_USER4 ).getStringValue();
            if( _contact.countValues( BlackBerryContact.USER4 ) == 0 ) {
                if( value.length() > 0 ) {
                    _contact.addString( BlackBerryContact.USER4, PIMItem.ATTR_NONE, value );
                }
            } else {
                if( value.length() > 0 ) {
                    _contact.setString( BlackBerryContact.USER4, 0, PIMItem.ATTR_NONE, value );
                } else {
                    _contact.removeValue( BlackBerryContact.USER4, 0 );
                }
            }

            // pin
            value = _outer.getItem( ContactObject.FIELD_PIN ).getStringValue();
            if( _contact.countValues( BlackBerryContact.PIN ) == 0 ) {
                if( value.length() > 0 ) {
                    _contact.addString( BlackBerryContact.PIN, PIMItem.ATTR_NONE, value );
                }
            } else {
                if( value.length() > 0 ) {
                    _contact.setString( BlackBerryContact.PIN, 0, PIMItem.ATTR_NONE, value );
                } else {
                    _contact.removeValue( BlackBerryContact.PIN, 0 );
                }
            }
            setPhoto();

            // categories
            CategoryNamespace.updateCategories( _contact, contactList, _outer );
        }

        /**
         * Commits the changes
         *
         * @throws Exception
         */
        public void commit() throws Exception {
            if( _contact == null ) {
                return;
            }

            // save the contact to the address book
            _contact.commit();

            // uid
            final String uid = _contact.getString( Contact.UID, 0 );
            _outer.getItem( ContactObject.FIELD_UID ).setValue( uid );
        }

        /**
         * @see blackberry.core.ScriptableFunctionBase#execute(java.lang.Object, java.lang.Object[])
         */
        public Object execute( Object innerThiz, Object[] innerArgs ) throws Exception {
            update();
            commit();

            return UNDEFINED;
        }

        private void setAddress( Contact c, int attribute, String[] address ) {
            if( c.countValues( Contact.ADDR ) == 0 ) {
                if( address[ Contact.ADDR_STREET ].length() > 0 || address[ Contact.ADDR_LOCALITY ].length() > 0
                        || address[ Contact.ADDR_REGION ].length() > 0 || address[ Contact.ADDR_POSTALCODE ].length() > 0
                        || address[ Contact.ADDR_COUNTRY ].length() > 0 || address[ Contact.ADDR_EXTRA ].length() > 0 ) {
                    c.addStringArray( Contact.ADDR, attribute, address );
                }
            } else {
                boolean isExisting = false;
                for( int j = 0; j < c.countValues( Contact.ADDR ); j++ ) {
                    if( attribute == c.getAttributes( Contact.ADDR, j ) ) {
                        if( address[ Contact.ADDR_STREET ].length() > 0 || address[ Contact.ADDR_LOCALITY ].length() > 0
                                || address[ Contact.ADDR_REGION ].length() > 0 || address[ Contact.ADDR_POSTALCODE ].length() > 0
                                || address[ Contact.ADDR_COUNTRY ].length() > 0 || address[ Contact.ADDR_EXTRA ].length() > 0 ) {
                            c.setStringArray( Contact.ADDR, j, attribute, address );
                        } else {
                            c.removeValue( Contact.ADDR, j );
                        }
                        isExisting = true;
                        break;
                    }
                }

                if( !isExisting ) {
                    if( address[ Contact.ADDR_STREET ].length() > 0 || address[ Contact.ADDR_LOCALITY ].length() > 0
                            || address[ Contact.ADDR_REGION ].length() > 0 || address[ Contact.ADDR_POSTALCODE ].length() > 0
                            || address[ Contact.ADDR_COUNTRY ].length() > 0 || address[ Contact.ADDR_EXTRA ].length() > 0 ) {
                        c.addStringArray( Contact.ADDR, attribute, address );
                    }
                }
            }
        }

        private void setTelephone( Contact c, int attribute, String tel ) {
            if( c.countValues( Contact.TEL ) == 0 ) {
                if( tel.length() > 0 ) {
                    c.addString( Contact.TEL, attribute, tel );
                }
            } else {
                boolean isExisting = false;
                for( int j = 0; j < c.countValues( Contact.TEL ); j++ ) {
                    if( attribute == c.getAttributes( Contact.TEL, j ) ) {
                        if( tel.length() > 0 ) {
                            c.setString( Contact.TEL, j, attribute, tel );
                        } else {
                            c.removeValue( Contact.TEL, j );
                        }
                        isExisting = true;
                        break;
                    }
                }

                if( !isExisting ) {
                    if( tel.length() > 0 ) {
                        try {
                            c.addString( Contact.TEL, attribute, tel );
                        } catch( FieldFullException e ) {
                        }
                    }
                }
            }
        }
    }

    private void setPhoto() throws IOException {
        String picture = (String) getItem( FIELD_PICTURE ).getValue();

        if( picture.length() == 0 ) {
            if( _contact.countValues( Contact.PHOTO ) > 0 ) {
                _contact.removeValue( Contact.PHOTO, 0 );
            }
            return;
        }

        byte[] photoEncoded = picture.getBytes( PICTURE_ENCODING );

        if( _contact.countValues( Contact.PHOTO ) > 0 ) {
            _contact.setBinary( Contact.PHOTO, 0, PIMItem.ATTR_NONE, photoEncoded, 0, photoEncoded.length );
        } else {
            _contact.addBinary( Contact.PHOTO, PIMItem.ATTR_NONE, photoEncoded, 0, photoEncoded.length );
        }
    }

    /**
     * This class implements the remove function of a Contact
     *
     */
    public class ContactRemoveScriptableFunction extends ScriptableFunctionBase {

        /**
         * Default constructor of a ContactRemoveScriptableFunction
         */
        public ContactRemoveScriptableFunction() {
            super();
        }

        /**
         * @see blackberry.core.ScriptableFunctionBase#execute(java.lang.Object, java.lang.Object[])
         */
        public Object execute( Object innerThiz, Object[] innerArgs ) throws Exception {

            // if the _contact is not in ContactList, do nothing
            if( _contact == null ) {
                throw new PIMException( "PIMItem not found." );
            }

            // open the handheld contacts database for removing
            ContactList contactList;
            if( _serviceName.length() == 0 ) {
                contactList = (ContactList) BlackBerryPIM.getInstance().openPIMList( PIM.CONTACT_LIST, PIM.WRITE_ONLY );
            } else {
                contactList = (ContactList) BlackBerryPIM.getInstance().openPIMList( PIM.CONTACT_LIST, PIM.WRITE_ONLY,
                        _serviceName );
            }

            contactList.removeContact( _contact );
            _contact = null;

            return UNDEFINED;
        }
    }

    /**
     * This class implements the setPicture method of a Contact
     *
     */
    public class ContactSetPictureScriptableFunction extends ScriptableFunctionBase {

        /**
         * Default constructor of a ContactSetPictureScriptableFunction
         */
        public ContactSetPictureScriptableFunction() {
            super();
        }

        /**
         * @see blackberry.core.ScriptableFunctionBase#execute(java.lang.Object, java.lang.Object[])
         */
        public Object execute( Object innerThiz, Object[] innerArgs ) throws Exception {
            setPictureProperty( (Blob) innerArgs[ 0 ] );
            return UNDEFINED;
        }

        /**
         * @see net.rim.device.api.web.jse.base.ScriptableFunctionBase
         */
        protected FunctionSignature[] getFunctionSignatures() {
            FunctionSignature fs = new FunctionSignature( 1 );
            fs.addParam( Blob.class, true );
            return new FunctionSignature[] { fs };
        }
    }

    private void setPictureProperty( Blob blobPicture ) throws Exception {
        byte[] photo = blobPicture.getBytes();
        byte[] photoEncoded = Base64OutputStream.encode( photo, 0, photo.length, false, false );

        String picture = new String( photoEncoded, PICTURE_ENCODING );
        getItem( FIELD_PICTURE ).setValue( picture );
    }

    // Injects fields and methods
    private void initial() {
        if( _contact != null ) {
            // name & title
            if( _contact.countValues( Contact.NAME ) == 0 ) {
                addItem( new ScriptField( FIELD_TITLE, "", ScriptField.TYPE_STRING, false, false ) );
                addItem( new ScriptField( FIELD_FIRSTNAME, "", ScriptField.TYPE_STRING, false, false ) );
                addItem( new ScriptField( FIELD_LASTNAME, "", ScriptField.TYPE_STRING, false, false ) );
            } else {
                String[] name;
                name = _contact.getStringArray( Contact.NAME, 0 );
                addItem( new ScriptField( FIELD_TITLE,
                        ( name[ Contact.NAME_PREFIX ] != null ) ? name[ Contact.NAME_PREFIX ] : "", ScriptField.TYPE_STRING,
                        false, false ) );
                addItem( new ScriptField( FIELD_FIRSTNAME, ( name[ Contact.NAME_GIVEN ] != null ) ? name[ Contact.NAME_GIVEN ]
                        : "", ScriptField.TYPE_STRING, false, false ) );
                addItem( new ScriptField( FIELD_LASTNAME, ( name[ Contact.NAME_FAMILY ] != null ) ? name[ Contact.NAME_FAMILY ]
                        : "", ScriptField.TYPE_STRING, false, false ) );
            }

            // homeAddress & workAddress
            AddressObject homeAddress = new AddressObject();
            AddressObject workAddress = new AddressObject();
            addItem( new ScriptField( FIELD_HOMEADDRESS, null, ScriptField.TYPE_SCRIPTABLE, false, false ) );
            addItem( new ScriptField( FIELD_WORKADDRESS, null, ScriptField.TYPE_SCRIPTABLE, false, false ) );

            int count = _contact.countValues( Contact.ADDR );
            if( count > 0 ) {
                for( int j = 0; j < count; j++ ) {
                    String[] address;
                    address = _contact.getStringArray( Contact.ADDR, j );
                    int attribute = _contact.getAttributes( Contact.ADDR, j );

                    if( Contact.ATTR_HOME == attribute ) {
                        populateAddressObject( homeAddress, address );
                        addItem( new ScriptField( FIELD_HOMEADDRESS, homeAddress, ScriptField.TYPE_SCRIPTABLE, false, false ) );
                    } else if( Contact.ATTR_WORK == attribute ) {
                        populateAddressObject( workAddress, address );
                        addItem( new ScriptField( FIELD_WORKADDRESS, workAddress, ScriptField.TYPE_SCRIPTABLE, false, false ) );
                    }
                }
            }

            // email
            addItem( new ScriptField( FIELD_EMAIL1, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_EMAIL2, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_EMAIL3, "", ScriptField.TYPE_STRING, false, false ) );

            count = _contact.countValues( Contact.EMAIL );
            if( count > 0 ) {
                for( int j = 0; j < count; j++ ) {
                    String email = _contact.getString( Contact.EMAIL, j );
                    if( j == 0 ) {
                        addItem( new ScriptField( FIELD_EMAIL1, email, ScriptField.TYPE_STRING, false, false ) );
                    } else if( j == 1 ) {
                        addItem( new ScriptField( FIELD_EMAIL2, email, ScriptField.TYPE_STRING, false, false ) );
                    } else if( j == 2 ) {
                        addItem( new ScriptField( FIELD_EMAIL3, email, ScriptField.TYPE_STRING, false, false ) );
                    }
                }
            }

            // company
            if( _contact.countValues( Contact.ORG ) > 0 ) {
                addItem( new ScriptField( FIELD_COMPANY, _contact.getString( Contact.ORG, 0 ), ScriptField.TYPE_STRING, false,
                        false ) );
            } else {
                addItem( new ScriptField( FIELD_COMPANY, "", ScriptField.TYPE_STRING, false, false ) );
            }

            // jobtitle
            if( _contact.countValues( Contact.TITLE ) > 0 ) {
                addItem( new ScriptField( FIELD_JOBTITLE, _contact.getString( Contact.TITLE, 0 ), ScriptField.TYPE_STRING, false,
                        false ) );
            } else {
                addItem( new ScriptField( FIELD_JOBTITLE, "", ScriptField.TYPE_STRING, false, false ) );
            }

            // phone
            addItem( new ScriptField( FIELD_HOMEPHONE, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_HOMEPHONE2, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_WORKPHONE, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_WORKPHONE2, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_MOBILEPHONE, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_MOBILEPHONE2, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_FAXPHONE, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_FAXPHONE2, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_PAGERPHONE, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_OTHERPHONE, "", ScriptField.TYPE_STRING, false, false ) );

            count = _contact.countValues( Contact.TEL );
            if( count > 0 ) {
                for( int j = 0; j < count; j++ ) {
                    String tel = _contact.getString( Contact.TEL, j );
                    int attribute = _contact.getAttributes( Contact.TEL, j );

                    if( Contact.ATTR_HOME == attribute ) {
                        addItem( new ScriptField( FIELD_HOMEPHONE, tel, ScriptField.TYPE_STRING, false, false ) );
                    } else if( BlackBerryContact.ATTR_HOME2 == attribute ) {
                        addItem( new ScriptField( FIELD_HOMEPHONE2, tel, ScriptField.TYPE_STRING, false, false ) );
                    } else if( Contact.ATTR_WORK == attribute ) {
                        addItem( new ScriptField( FIELD_WORKPHONE, tel, ScriptField.TYPE_STRING, false, false ) );
                    } else if( BlackBerryContact.ATTR_WORK2 == attribute ) {
                        addItem( new ScriptField( FIELD_WORKPHONE2, tel, ScriptField.TYPE_STRING, false, false ) );
                    } else if( Contact.ATTR_MOBILE == attribute ) {
                        addItem( new ScriptField( FIELD_MOBILEPHONE, tel, ScriptField.TYPE_STRING, false, false ) );
                    } else if( Contact.ATTR_FAX == attribute ) {
                        addItem( new ScriptField( FIELD_FAXPHONE, tel, ScriptField.TYPE_STRING, false, false ) );
                    } else if( Contact.ATTR_PAGER == attribute ) {
                        addItem( new ScriptField( FIELD_PAGERPHONE, tel, ScriptField.TYPE_STRING, false, false ) );
                    } else if( Contact.ATTR_OTHER == attribute ) {
                        addItem( new ScriptField( FIELD_OTHERPHONE, tel, ScriptField.TYPE_STRING, false, false ) );
                    }
                }
            }

            // note
            if( _contact.countValues( Contact.NOTE ) > 0 ) {
                addItem( new ScriptField( FIELD_NOTE, _contact.getString( Contact.NOTE, 0 ), ScriptField.TYPE_STRING, false,
                        false ) );
            } else {
                addItem( new ScriptField( FIELD_NOTE, "", ScriptField.TYPE_STRING, false, false ) );
            }

            // webpage
            try {
                if( _contact.countValues( Contact.URL ) > 0 ) {
                    addItem( new ScriptField( FIELD_WEBPAGE, _contact.getString( Contact.URL, 0 ), ScriptField.TYPE_STRING,
                            false, false ) );
                } else {
                    addItem( new ScriptField( FIELD_WEBPAGE, "", ScriptField.TYPE_STRING, false, false ) );
                }
            } catch( UnsupportedFieldException e ) {
                addItem( new ScriptField( FIELD_WEBPAGE, "", ScriptField.TYPE_STRING, false, false ) );
            }

            // birthday & anniiversary
            if( _contact.countValues( Contact.BIRTHDAY ) > 0 ) {
                addItem( new ScriptField( FIELD_BIRTHDAY, new Date( _contact.getDate( Contact.BIRTHDAY, 0 ) ),
                        ScriptField.TYPE_DATE, false, false ) );
            } else {
                addItem( new ScriptField( FIELD_BIRTHDAY, null, ScriptField.TYPE_DATE, false, false ) );
            }

            if( _contact.countValues( BlackBerryContact.ANNIVERSARY ) > 0 ) {
                addItem( new ScriptField( FIELD_ANNIVERSARY, new Date( _contact.getDate( BlackBerryContact.ANNIVERSARY, 0 ) ),
                        ScriptField.TYPE_DATE, false, false ) );
            } else {
                addItem( new ScriptField( FIELD_ANNIVERSARY, null, ScriptField.TYPE_DATE, false, false ) );
            }

            // user
            if( _contact.countValues( BlackBerryContact.USER1 ) > 0 ) {
                addItem( new ScriptField( FIELD_USER1, _contact.getString( BlackBerryContact.USER1, 0 ), ScriptField.TYPE_STRING,
                        false, false ) );
            } else {
                addItem( new ScriptField( FIELD_USER1, "", ScriptField.TYPE_STRING, false, false ) );
            }

            if( _contact.countValues( BlackBerryContact.USER2 ) > 0 ) {
                addItem( new ScriptField( FIELD_USER2, _contact.getString( BlackBerryContact.USER2, 0 ), ScriptField.TYPE_STRING,
                        false, false ) );
            } else {
                addItem( new ScriptField( FIELD_USER2, "", ScriptField.TYPE_STRING, false, false ) );
            }

            if( _contact.countValues( BlackBerryContact.USER3 ) > 0 ) {
                addItem( new ScriptField( FIELD_USER3, _contact.getString( BlackBerryContact.USER3, 0 ), ScriptField.TYPE_STRING,
                        false, false ) );
            } else {
                addItem( new ScriptField( FIELD_USER3, "", ScriptField.TYPE_STRING, false, false ) );
            }

            if( _contact.countValues( BlackBerryContact.USER4 ) > 0 ) {
                addItem( new ScriptField( FIELD_USER4, _contact.getString( BlackBerryContact.USER4, 0 ), ScriptField.TYPE_STRING,
                        false, false ) );
            } else {
                addItem( new ScriptField( FIELD_USER4, "", ScriptField.TYPE_STRING, false, false ) );
            }

            // pin
            if( _contact.countValues( BlackBerryContact.PIN ) > 0 ) {
                addItem( new ScriptField( FIELD_PIN, _contact.getString( BlackBerryContact.PIN, 0 ), ScriptField.TYPE_STRING,
                        false, false ) );
            } else {
                addItem( new ScriptField( FIELD_PIN, "", ScriptField.TYPE_STRING, false, false ) );
            }

            // uid
            if( _contact.countValues( Contact.UID ) > 0 ) {
                addItem( new ScriptField( FIELD_UID, _contact.getString( Contact.UID, 0 ), ScriptField.TYPE_STRING, true, false ) );
            } else {
                addItem( new ScriptField( FIELD_UID, "", ScriptField.TYPE_STRING, true, false ) );
            }

            // picture
            if( _contact.countValues( Contact.PHOTO ) > 0 ) {
                byte[] photoEncoded = _contact.getBinary( Contact.PHOTO, 0 );
                String picture = "";
                try {
                    picture = new String( photoEncoded, PICTURE_ENCODING );
                } catch( UnsupportedEncodingException e ) {
                }
                addItem( new ScriptField( FIELD_PICTURE, picture, ScriptField.TYPE_STRING, true, false ) );
            } else {
                addItem( new ScriptField( FIELD_PICTURE, "", ScriptField.TYPE_STRING, true, false ) );
            }

            // categories
            addItem( new ScriptField( FIELD_CATEGORIES, _contact.getCategories(), ScriptField.TYPE_SCRIPTABLE, false, false ) );
        } else {
            // name & title
            addItem( new ScriptField( FIELD_TITLE, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_FIRSTNAME, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_LASTNAME, "", ScriptField.TYPE_STRING, false, false ) );

            // homeAddress & workAddress
            addItem( new ScriptField( FIELD_HOMEADDRESS, null, ScriptField.TYPE_SCRIPTABLE, false, false ) );
            addItem( new ScriptField( FIELD_WORKADDRESS, null, ScriptField.TYPE_SCRIPTABLE, false, false ) );

            // email
            addItem( new ScriptField( FIELD_EMAIL1, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_EMAIL2, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_EMAIL3, "", ScriptField.TYPE_STRING, false, false ) );

            // company
            addItem( new ScriptField( FIELD_COMPANY, "", ScriptField.TYPE_STRING, false, false ) );

            // jobtitle
            addItem( new ScriptField( FIELD_JOBTITLE, "", ScriptField.TYPE_STRING, false, false ) );

            // phone
            addItem( new ScriptField( FIELD_HOMEPHONE, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_HOMEPHONE2, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_WORKPHONE, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_WORKPHONE2, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_MOBILEPHONE, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_MOBILEPHONE2, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_FAXPHONE, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_FAXPHONE2, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_PAGERPHONE, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_OTHERPHONE, "", ScriptField.TYPE_STRING, false, false ) );

            // note
            addItem( new ScriptField( FIELD_NOTE, "", ScriptField.TYPE_STRING, false, false ) );

            // webpage
            addItem( new ScriptField( FIELD_WEBPAGE, "", ScriptField.TYPE_STRING, false, false ) );

            // birthday & anniiversary
            addItem( new ScriptField( FIELD_BIRTHDAY, null, ScriptField.TYPE_DATE, false, false ) );
            addItem( new ScriptField( FIELD_ANNIVERSARY, null, ScriptField.TYPE_DATE, false, false ) );

            // user
            addItem( new ScriptField( FIELD_USER1, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_USER2, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_USER3, "", ScriptField.TYPE_STRING, false, false ) );
            addItem( new ScriptField( FIELD_USER4, "", ScriptField.TYPE_STRING, false, false ) );

            // pin
            addItem( new ScriptField( FIELD_PIN, "", ScriptField.TYPE_STRING, false, false ) );

            // uid
            addItem( new ScriptField( FIELD_UID, "", ScriptField.TYPE_STRING, true, false ) );

            // picture
            addItem( new ScriptField( FIELD_PICTURE, "", ScriptField.TYPE_STRING, true, false ) );

            // categories
            addItem( new ScriptField( FIELD_CATEGORIES, null, ScriptField.TYPE_SCRIPTABLE, false, false ) );
        }

        _save = new ContactSaveScriptableFunction();
        _remove = new ContactRemoveScriptableFunction();
        _setPicture = new ContactSetPictureScriptableFunction();

        addItem( new ScriptField( METHOD_SAVE, _save, ScriptField.TYPE_SCRIPTABLE, true, true ) );
        addItem( new ScriptField( METHOD_REMOVE, _remove, ScriptField.TYPE_SCRIPTABLE, true, true ) );
        addItem( new ScriptField( METHOD_SETPICTURE, _setPicture, ScriptField.TYPE_SCRIPTABLE, true, true ) );
    }

    private void populateAddressObject( AddressObject addressObject, String[] address ) {
        if( address[ Contact.ADDR_STREET ] != null )
            addressObject.getItem( AddressObject.FIELD_ADDRESS1 ).setValue( address[ Contact.ADDR_STREET ] );
        if( address[ Contact.ADDR_LOCALITY ] != null )
            addressObject.getItem( AddressObject.FIELD_CITY ).setValue( address[ Contact.ADDR_LOCALITY ] );
        if( address[ Contact.ADDR_REGION ] != null )
            addressObject.getItem( AddressObject.FIELD_STATE ).setValue( address[ Contact.ADDR_REGION ] );
        if( address[ Contact.ADDR_POSTALCODE ] != null )
            addressObject.getItem( AddressObject.FIELD_ZIP ).setValue( address[ Contact.ADDR_POSTALCODE ] );
        if( address[ Contact.ADDR_COUNTRY ] != null )
            addressObject.getItem( AddressObject.FIELD_COUNTRY ).setValue( address[ Contact.ADDR_COUNTRY ] );
        if( address[ Contact.ADDR_EXTRA ] != null )
            addressObject.getItem( AddressObject.FIELD_ADDRESS2 ).setValue( address[ Contact.ADDR_EXTRA ] );
    }

    /**
     * @see blackberry.core.ScriptableObjectBase#verify(blackberry.core.ScriptField, java.lang.Object)
     */
    protected boolean verify( ScriptField field, Object newValue ) throws Exception {
        return true;
    }

    /**
     * Internal helper method to get direct access to the ContactObject's underlying content.
     *
     * @return the contained blackberry contact item.
     */
    public Contact getContact() {
        return _contact;
    }

    /**
     * Returns the categories of a Contact object
     *
     * @return the categories
     * @throws Exception
     *             when the categories cannot be obtained
     */
    public String[] getCategories() throws Exception {
        return CategoryNamespace.getCategoriesFromScriptField( getItem( FIELD_CATEGORIES ) );
    }

    /**
     * Updates the Contact object
     *
     * @throws Exception
     */
    public void update() throws Exception {
        _save.update();
    }

    /**
     * Saves the Contact object
     *
     * @throws Exception
     */
    public void save() throws Exception {
        _save.execute( null, null );
    }
}
TOP

Related Classes of blackberry.pim.contact.ContactObject$ContactRemoveScriptableFunction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.
ew');