2012-04-30 16 views
5

especificación Bluetooth FTP dice que tengo que usar la operación ACCIÓN, aquí está una página http://i47.tinypic.com/2425t2v.pngCómo implementar la operación ACTION (mover/cambiar el nombre, establecer permisos) en J2ME Bluetooth OBEX?

Pero el ClentSession proporciona solamente GET y PUT operaciones, y nada se menciona en javadocs.

así es como se ve la operación de creación del archivo, es bastante fácil

public void create() throws IOException { 
     HeaderSet hs = cs.createHeaderSet(); 
     hs.setHeader(HeaderSet.NAME, file); 
     op = cs.put(hs); 
     OutputStream os = op.openOutputStream(); 
     os.close(); 
     op.close(); 
    } 

Pregunta 1: ¿Cómo se implementa la operación de acción con cabeceras personalizadas para realizar movimiento renombrar y establecer permisos /? Debería ser posible sin la API JSR82 OBEX. Por favor, ayúdame a hacer esto.

Pregunta 2: ¿Entiendo cómo establecer permisos? Según OBEX_Errata compilado para 1.3.pdf

1 http://i45.tinypic.com/2h84led.jpg

2 http://i49.tinypic.com/2wgysmx.png

Por lo tanto, para establecer sólo lectura, yo debería hacer lo siguiente (alanjmcf gracias!):

int a = 0; 

    //byte 0 //zero 
    //byte 1 //user 
    //byte 2 //group 
    //byte 3 //other 

    //set read for user 
    a |= (1 << 7); //8th bit - byte 1, bit 0 -> set to 1 
    // a = 10000000 

    //for group 
    a |= (1 << 15); //16th bit - byte 2, bit 0 -> set to 1 
    // a = 1000000010000000 

    //for other 
    a |= (1 << 23); //24th bit - byte 3, bit 0 -> set to 1 
    // a = 100000001000000010000000 

    //or simply 
    private static final int READ = 8421504 //1000,0000,1000,0000,1000,0000 
    int value = 0 | READ; 

    //========== calculate write constant ========= 
    a = 0; 
    a |= (1 << 8); //write user 
    a |= (1 << 16); //write group 
    a |= (1 << 24); //write other 
    // a = 1000000010000000100000000 
    private static final int WRITE = 16843008 // 1,0000,0001,0000,0001,0000,0000 

    //========= calculate delete constant ========== 
    a = 0; 
    a |= (1 << 9); //delete user 
    a |= (1 << 17); //delete group 
    a |= (1 << 25); //delete other 
    //a = 10000000100000001000000000 
    private static final DELETE = 33686016; //10,0000,0010,0000,0010,0000,0000 

    //========= calculate modify constant ========== 
    a = 0; 
    a |= (1 << (7 + 7)); //modify user 
    a |= (1 << (15 + 7)); //modify group 
    a |= (1 << (23 + 7)); //modify other 
    //a = 1000000010000000100000000000000 
    private static final MODIFY = 1077952512; // 100,0000,0100,0000,0100,0000,0000,0000 


    // now, if i want to set read-write-delete-modify, I will do the following: 
    int rwdm = 0 | READ | WRITE | DELETE | MODIFY; 
    // and put the value to the header... am I right? 

si a la derecha, el único problema sigue siendo la pregunta 1: ¿cómo hago la operación de ACCIÓN y cómo configurar los encabezados?

+0

+1 para todas las imágenes brillantes! –

+1

http://code.google.com/p/blueframe/source/checkout - tal vez algo allí –

+0

@AmigableClarkKant Los dispositivos intercambian datos de su propio formato. No me ayuda a crear encabezados que el dispositivo de destino reconocerá como OBEX. –

Respuesta

3

Tenga en cuenta que el texto que cita de la especificación Bluetooth FTP menciona tres encabezados: ActionId, Name, DestName. Por lo tanto, debe agregar un encabezado NAME y un encabezado DestName. JSR-82 al parecer no define el const para esa (nueva) cabecea de manera citando la especificación OBEX:

MODIFICACIÓN
2.1 OBEX encabezados

HI identifier | Header name | Description 
0x94   Action Id  Specifies the action to be performed (used in ACTION operation) 
0x15   DestName  The destination object name (used in certain ACTION operations) 
0xD6   Permissions 4 byte bit mask for setting permissions 
0x17 to 0x2F Reserved for future use. This range includes all combinations of the upper 2 bits 

Por lo tanto crear la siguiente etc. (Mi una de Java poco oxidado)

static final int DEST_NAME = 0x15; 

Y utilízalo en tu código.

[AGREGAR] ¡Todas las operaciones (acciones) que son acciones utilizan la operación de ACCIÓN! : -,) Eso es usar OBCE opcode ACTION en lugar de PUT o GET, etc. El valor de opcode ACTION es 0x86.

Estoy leyendo esto de "OBEX_Errata Compiled For 1.3.pdf". El IrDA cobró por las especificaciones, pero parece que ahora las proporciona a pedido (http://www.irda.org). Solicite una copia de las últimas especificaciones OBEX (1.5 IIRC). Lo he hecho yo mismo pero aún no he recibido una respuesta. O tal vez intentes buscar en Google para decir "mover/cambiar el nombre de la acción del objeto" para obtener ese PDF '1.3 Errata'.

De todos modos, si Java le impide usar nuevos Opcodes (solo permite GET y PUT) y también le impide usar nuevos valores de HeaderId, entonces no puede continuar de todos modos. :-(* (No hay razón para que lo hagan ya que HeaderId codifica el tipo de datos que contiene).

Después de echar otro vistazo a la API de Java, no veo ninguna forma de enviar un comando arbitrario sobre ClientSession. Tendría que compilar manualmente los paquetes, conectarse al servicio OBEX y luego enviar y recibir paquetes a través de esa conexión.No es demasiado difícil de construir los paquetes ...

+0

Pero todavía no tengo la idea de cómo hacerlo. –

+0

Aunque esta respuesta fue otorgada, mi pregunta permanece sin respuesta. –

Cuestiones relacionadas