FileDocCategorySizeDatePackage
ServiceRecordSerializer.javaAPI DocphoneME MR2 API (J2ME)4950Wed May 02 18:00:32 BST 2007com.sun.kvem.jsr082.bluetooth

ServiceRecordSerializer.java

/*
 *   
 *
 * Copyright  1990-2007 Sun Microsystems, Inc. All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 2 only, as published by the Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License version 2 for more details (a copy is
 * included at /legal/license.txt).
 * 
 * You should have received a copy of the GNU General Public License
 * version 2 along with this work; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 * 
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
 * Clara, CA 95054 or visit www.sun.com if you need additional
 * information or have any questions.
 */
package com.sun.kvem.jsr082.bluetooth;
import java.io.IOException;
import java.util.Enumeration;
import javax.bluetooth.DataElement;
import javax.bluetooth.ServiceRecord;

/**
 * Serializes ServiceRecord objects.
 */
public class ServiceRecordSerializer {

    /** Helper object used for data element serialization. */
    static DataElementSerializer des;

    /** Initializes static fields. */
    static {
        des = new DataElementSerializer();
    }

    /**
     * Serializes given service record - creates an array of bytes representing
     * data elements as described in Bluetooth Specification Version 1.2,
     * vol 3, page 127.
     *
     * @param record the service record to serialize
     * @return an array containing the serialized record
     */
    public static synchronized byte[] serialize(ServiceRecord record) {
        DataElement seq = new DataElement(DataElement.DATSEQ);
        int[] attrIDs = record.getAttributeIDs();
        for (int i = 0; i < attrIDs.length; i++) {
            DataElement attrID = new DataElement(DataElement.U_INT_2,
                    attrIDs[i]);
            DataElement attrValue = record.getAttributeValue(attrIDs[i]);
            if (attrValue != null) {
                seq.addElement(attrID);
                seq.addElement(attrValue);
            }
        }
        try {
            return des.serialize(seq);
        } catch (IOException e) {
            return null;
        }
    }

    /**
     * Restores previously serialized service record.
     *
     * @param notifier notifier object the newly created record
     *         to be associated with
     * @param data serialized service record data
     * @return restored service record
     */
    public static synchronized ServiceRecordImpl restore(
            BluetoothNotifier notifier, byte[] data) {
        DataElement seq;
        try {
            seq = des.restore(data);
        } catch (IOException e) {
            return null;
        }
        Enumeration elements = (Enumeration)seq.getValue();
        int[] attrIDs = new int[seq.getSize() / 2];
        DataElement[] attrValues = new DataElement[attrIDs.length];
        for (int i = 0; i < attrIDs.length; i++) {
            attrIDs[i] = (int)((DataElement)elements.nextElement()).getLong();
            DataElement attrValue = (DataElement)elements.nextElement();
            DataElement newAttrValue;
            int dataType = attrValue.getDataType();
            switch (dataType) {
                case DataElement.BOOL:
                    newAttrValue = new DataElement(attrValue.getBoolean());
                    break;
                case DataElement.NULL:
                    newAttrValue = new DataElement(DataElement.NULL);
                    break;
                case DataElement.U_INT_1:
                case DataElement.U_INT_2:
                case DataElement.U_INT_4:
                case DataElement.INT_1:
                case DataElement.INT_2:
                case DataElement.INT_4:
                case DataElement.INT_8:
                    newAttrValue = new DataElement(dataType,
                            attrValue.getLong());
                    break;
                case DataElement.DATALT:
                case DataElement.DATSEQ:
                    Enumeration e = (Enumeration)attrValue.getValue();
                    newAttrValue = new DataElement(dataType);
                    while (e.hasMoreElements()) {
                        newAttrValue.addElement((DataElement)e.nextElement());
                    }
                    break;
                default:
                    newAttrValue = new DataElement(attrValue.getDataType(),
                            attrValue.getValue());
                    break;
            }
            attrValues[i] = newAttrValue;
        }
        return new ServiceRecordImpl(notifier, attrIDs, attrValues);
    }

}