/*
 * Copyright (C) 2010 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 android.drm;

import java.util.HashMap;

/**
 * A base class that is used to send asynchronous event information from the DRM framework.
 *
 */
public class DrmEvent {

    // Please do not add type constants in this class. More event type constants
    // should go to DrmInfoEvent or DrmErrorEvent classes.

    /**
     * All of the rights information associated with all DRM schemes have been successfully removed.
     */
    public static final int TYPE_ALL_RIGHTS_REMOVED = 1001;
    /**
     * The given DRM information has been successfully processed.
     */
    public static final int TYPE_DRM_INFO_PROCESSED = 1002;
    /**
     * The key that is used in the <code>attributes</code> HashMap to pass the return status.
     */
    public static final String DRM_INFO_STATUS_OBJECT = "drm_info_status_object";
    /**
     * The key that is used in the <code>attributes</code> HashMap to pass the
     * {@link DrmInfo} object.
     */
    public static final String DRM_INFO_OBJECT = "drm_info_object";

    private final int mUniqueId;
    private final int mType;
    private String mMessage = "";

    private HashMap<String, Object> mAttributes = new HashMap<String, Object>();

    /**
     * Creates a <code>DrmEvent</code> object with the specified parameters.
     *
     * @param uniqueId Unique session identifier.
     * @param type Type of information.
     * @param message Message description.
     * @param attributes Attributes for extensible information.
     */
    protected DrmEvent(int uniqueId, int type, String message,
                            HashMap<String, Object> attributes) {
        mUniqueId = uniqueId;
        mType = type;

        if (null != message) {
            mMessage = message;
        }

        if (null != attributes) {
            mAttributes = attributes;
        }
    }

    /**
     * Creates a <code>DrmEvent</code> object with the specified parameters.
     *
     * @param uniqueId Unique session identifier.
     * @param type Type of information.
     * @param message Message description.
     */
    protected DrmEvent(int uniqueId, int type, String message) {
        mUniqueId = uniqueId;
        mType = type;

        if (null != message) {
            mMessage = message;
        }
    }

    /**
     * Retrieves the unique session identifier associated with this object.
     *
     * @return The unique session identifier.
     */
    public int getUniqueId() {
        return mUniqueId;
    }

    /**
     * Retrieves the type of information that is associated with this object.
     *
     * @return The type of information.
     */
    public int getType() {
        return mType;
    }

    /**
     * Retrieves the message description associated with this object.
     *
     * @return The message description.
     */
    public String getMessage() {
        return mMessage;
    }

    /**
     * Retrieves the attribute associated with the specified key.
     *
     * @return One of the attributes or null if no mapping for
     * the key is found.
     */
    public Object getAttribute(String key) {
        return mAttributes.get(key);
    }
}
