Как реализовать операцию ACTION (перемещение / переименование, установка разрешений) в J2ME Bluetooth OBEX?

Спецификация Bluetooth FTP говорит, что мне нужно использовать операцию ACTION, вот страница http://i47.tinypic.com/2425t2v.png

Но ClentSession предоставляет только операции GET и PUT, и ничего не упоминается в javadocs.

вот как выглядит операция создания файла, это довольно легко

    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();
    }

Вопрос 1: Как реализовать операцию ACTION с пользовательскими заголовками для выполнения перемещения / переименования и установки разрешений? Это должно быть возможно без JSR82 OBEX API. Пожалуйста, помогите мне сделать это.

Вопрос 2: Я понял, как установить разрешения? Согласно OBEX_Errata скомпилировано для 1.3.pdf (спасибо alanjmcf!)

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

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

Итак, чтобы установить только для чтения, я должен сделать следующее:

    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?

если правильно, единственной проблемой остается вопрос 1: как сделать операцию ACTION и как установить заголовки.

1 ответ

Обратите внимание, что в тексте, который вы цитируете из спецификации Bluetooth FTP, упоминаются три заголовка: ActionId, Name, DestName. Поэтому вам нужно добавить один заголовок NAME и один заголовок DestName. Jsr-82, очевидно, не определяет const для этого (нового) заголовка, поэтому цитируем из спецификации OBEX:

МОДИФИКАЦИЯ
2.1 OBEX Заголовки

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

Так что создайте следующее и т. Д. (Моя Java немного ржавая)

static final int DEST_NAME = 0x15;

И используйте это в своем коде.

[ДОБАВИТЬ] Все операции (действия), которые являются действиями, используют операцию ACTION!:-,) То есть использовать код операции ACEX OBEX вместо PUT или GET и т. Д. Значение кода операции ACTION равно 0x86.

Я читаю это из "OBEX_Errata Compiled For 1.3.pdf". IrDA действительно взимает плату за спецификации, но, похоже, теперь предоставляет их по запросу ( http://www.irda.org/). Запросите копию последних спецификаций OBEX (1.5 IIRC). Я сделал это сам, но еще не получил ответ. Или вы можете попробовать поискать, скажем, "переместить / переименовать действие объекта", чтобы получить PDF "1.3 Errata".

В любом случае, если Java запрещает вам использовать новые коды операций (только с помощью GET и PUT), а также запрещает использовать новые значения HeaderId, вы все равно не сможете продолжить.:-( *(для них нет причин делать это, так как HeaderId кодирует тип данных, который он содержит).

После еще одного взгляда на API Java я не вижу способа отправить произвольную команду через ClientSession. Вам придется вручную создавать пакеты, подключаться к сервису OBEX, а затем отправлять и получать пакеты по этому соединению. Это не так уж сложно собрать пакеты...

Другие вопросы по тегам