Как реализовать операцию 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, а затем отправлять и получать пакеты по этому соединению. Это не так уж сложно собрать пакеты...