Implementar la protección de contenido

Las siguientes clases e interfaces se utilizan para implementar la protección de contenido:

Ejemplo de código: registrar un servicio de escucha

El siguiente ejemplo de código muestra una forma de registrar un servicio de escucha. En primer lugar, el código de ejemplo sincroniza el objeto PersistentObject, de forma que ningún otro pueda adquirir el bloqueo antes de que la operación de ejecución finalice. A continuación y, en caso de que sea necesario, el código iniciará el objeto PersistentObject. Registra un PersistentContentListener al iniciarse la aplicación.

public static void main(String[] args)
 {
     if ( args != null && args.length > 0 && args[0].equals("startup") )
     {
         PersistentObject store = PersistentStore.getPersistentObject(
                PERSISTENT_STORE_DEMO_ID);                       
         // Synchronize the PersistentObject.
         synchronized(store)
         {         
             // If the PersistentObject is empty, initialize it.
             if(store.getContents() == null)
             {
                 store.setContents(new Vector());
                 PersistentObject.commit(store);
             }            
         }    
         // Register a PersistentContentListener upon smartphone start-up.
         PersistentContent.addListener(new PersistentStoreListener());
     }
     else
     {   
         // Launch the GUI version of the app.
         PersistentStoreDemo theApp = new PersistentStoreDemo();
         theApp.enterEventDispatcher();
     }
 }

Ejemplo de código: implementar el servicio de escucha

El siguiente ejemplo de código implementa el servicio de escucha. El servicio de escucha detecta los cambios de la protección de contenido y la configuración de compresión del smartphone, además de los cambios en el estado del contenido constante, y lleva a cabo el proceso de codificación de datos correspondiente. En este ejemplo, se ignoran los cambios del estado del smartphone. (En este ejemplo se presupone que la codificación de los datos se produce siempre dentro de los objetos, por lo que no resulta necesario proceder a su codificación o decodificación durante el bloqueo y desbloqueo.) El parámetro generation se utiliza para determinar si la configuración de protección de contenido del smartphone ha cambiado desde que se notificó al servicio de escucha.

final class PersistentStoreListener implements PersistentContentListener
{
    public void persistentContentStateChanged(int state)
    {
        // There is nothing to do. It is assumed that data is encoded properly
        // when it is placed in the Vector written to the persistent store.
    }
    // Called when the smartphone's Content Protection/Compression security settings
    // are changed. Re-encodes the data accordingly.
    public void persistentContentModeChanged(int generation)
    {
        PersistentObject persist = PersistentStore.getPersistentObject(
        PersistentStoreDemo.PERSISTENT_STORE_DEMO_ID);
        if (persist != null)
        {
            synchronized(persist.getContents())
            {
                Vector meetings = (Vector) persist.getContents();
                if (meetings == null)
                {
                    // Contents empty; nothing to re-encode.
                    return;
                }
                // Get a ticket in case data must be decrypted as
                // part of re-encoding data.
                Object ticket = PersistentContent.getTicket();
                if (ticket == null )
                {
                    // No ticket is available. Stop trying
                    // to re-encode to avoid possible failures.
                    return;
                }
                for (int i = 0; i < meetings.size(); ++i)
                {
                    Meeting meeting = (Meeting)meetings.elementAt( i );
                    // meeting.reEncode();
                    // meeting object contains a _fields Vector.
                    for (int i = 0; i < meeting.NUM_FIELDS; ++i)
                    {
                        Object encoding = meeting._fields.elementAt(i);
                        if(!PersistentContent.checkEncoding(encoding))
                        {
                            encoding = PersistentContent.reEncode(encoding);
                            meeting._fields.setElementAt(encoding, i);
                        }
                    }
                    if ( generation != PersistentContent.getModeGeneration() )
                    {
                        // The smartphone's content protection or compression
                        // settings have changed again since the listener was
                        // last notified. Abort this re-encoding because it
                        // will have to be done again anyway according to the
                        // new content protection or compression settings.
                        break;
                    }
                }
                // Release the ticket.
                ticket = null;
                // Commit the updated data to the persistent store.
                persist.commit();
            }
        }
    }
}

¿Le ha resultado útil esta información? Envíenos sus comentarios.