summaryrefslogtreecommitdiff
authorkorovkin <korovkin>2006-03-20 21:44:55 (UTC)
committer korovkin <korovkin>2006-03-20 21:44:55 (UTC)
commit74546adb68bd3f17a75003671407c4a4e6b09e73 (patch) (side-by-side diff)
tree489034b13c803dca3e0e7e487e9465189a988c77
parent14fc21051eb3ff92527fd9ddeaf117009bd74af2 (diff)
downloadopie-74546adb68bd3f17a75003671407c4a4e6b09e73.zip
opie-74546adb68bd3f17a75003671407c4a4e6b09e73.tar.gz
opie-74546adb68bd3f17a75003671407c4a4e6b09e73.tar.bz2
Added file sending.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/opietooth/manager/obexftpdialog.cpp99
-rw-r--r--noncore/net/opietooth/manager/obexftpdialog.h2
-rw-r--r--noncore/net/opietooth/manager/obexftpdialogbase.cpp89
-rw-r--r--noncore/net/opietooth/manager/obexftpdialogbase.h18
-rw-r--r--noncore/net/opietooth/manager/obexftpdialogbase.ui211
5 files changed, 283 insertions, 136 deletions
diff --git a/noncore/net/opietooth/manager/obexftpdialog.cpp b/noncore/net/opietooth/manager/obexftpdialog.cpp
index c77d49d..80a81b4 100644
--- a/noncore/net/opietooth/manager/obexftpdialog.cpp
+++ b/noncore/net/opietooth/manager/obexftpdialog.cpp
@@ -12,9 +12,15 @@
* This code uses and is based on ObexFTP project code: http://triq.net/obexftp/
*/
#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
#include <qpushbutton.h>
#include <qmessagebox.h>
#include <qmultilineedit.h>
+#include <qspinbox.h>
+#include <qcombobox.h>
#include <qlistview.h>
#include <qprogressbar.h>
#include <qlabel.h>
@@ -49,6 +55,7 @@ ObexFtpDialog::ObexFtpDialog(const QString& device, int port,
m_port(port), curdir("")
{
client = NULL;
+ nRetries = 3;
transport = OBEX_TRANS_BLUETOOTH;
use_conn = TRUE;
use_path = TRUE;
@@ -68,12 +75,16 @@ ObexFtpDialog::ObexFtpDialog(const QString& device, int port,
destFile->setCloseVisible(false);
destFile->setNewVisible(false);
localLayout->addWidget(destFile);
+ nReries->setValue(nRetries);
connect(browseOK, SIGNAL(clicked()), SLOT(slotBrowse()));
connect(fileList, SIGNAL(clicked(QListViewItem*)),
SLOT(slotCd(QListViewItem*)));
connect(getButton,
SIGNAL(clicked()),
SLOT(getFile()));
+ connect(putButton,
+ SIGNAL(clicked()),
+ SLOT(putFile()));
connect(destFile,
SIGNAL(dirSelected (const QString&)),
SLOT(updateDir(const QString&)));
@@ -94,18 +105,36 @@ void ObexFtpDialog::slotBrowse()
{
stat_entry_t* ent; //Directory entry
void *dir; //Directory to read
- const uint8_t use_uuid[] = __UUID_FBS_bytes;
- int len = sizeof(UUID_FBS);
+ const uint8_t* use_uuid; //uuid
+ int len; //uuid length
FileListItem* root; //root node
- stat_entry_t* st; //File statistics
int fsize; //file size
+ bool numOk; //true if the string is a number
+ int tmp; //just a temp var
status(tr("Connecting to ") + m_device);
odebug << "Browse device " << m_device << oendl;
browseLog->clear();
fileList->clear();
progressStatus = 0;
+ fileProgress->setTotalSteps(MAX_PROGRESS);
fileProgress->reset();
+
+ //Get parameters
+ tmp = nReries->text().toInt(&numOk);
+ if (numOk)
+ nRetries = tmp;
+ if (uuidType->currentText() == "FBS") {
+ use_uuid = UUID_FBS;
+ len = sizeof(UUID_FBS);
+ } else if (uuidType->currentText() == "S45") {
+ use_uuid = UUID_S45;
+ len = sizeof(UUID_S45);
+ } else {
+ use_uuid = UUID_FBS;
+ len = sizeof(UUID_FBS);
+ }
+
if (!cli_connect_uuid(use_uuid, len)) {
log("Connection failed");
errBox("Connection failed");
@@ -121,13 +150,10 @@ void ObexFtpDialog::slotBrowse()
dir = obexftp_opendir(client, curdir);
while ((ent = obexftp_readdir(dir)) != NULL) {
FileListItem* a; //List view item
-#if 0 //Causes sigsegv
if (ent->mode != 16877) {
- st = obexftp_stat(client, ent->name);
- fsize = st->size;
+ fsize = ent->size;
}
else
-#endif
fsize = 0;
log(QString(ent->name) + QString(" ") +
QString::number(ent->mode));
@@ -222,6 +248,10 @@ void ObexFtpDialog::getFile()
if (local.right(1) != "/")
local += "/";
if (file->gettype() == IS_FILE) {
+ if (client == NULL) {
+ errBox("No connection established");
+ return;
+ }
file2get += curdir;
if (curdir != "" && curdir.right(1) != "/")
file2get += "/";
@@ -229,6 +259,7 @@ void ObexFtpDialog::getFile()
local += file->text(0);
odebug << "Copy " << file2get << " to " << local << oendl;
progressStatus = 0;
+ fileProgress->setTotalSteps(file->getsize() / 1024);
fileProgress->reset();
status(tr("Receiving file ") + file2get);
result = obexftp_get(client, local, file2get);
@@ -245,6 +276,54 @@ void ObexFtpDialog::getFile()
}
}
+/*
+ * Put the file
+ */
+void ObexFtpDialog::putFile()
+{
+ int result; //OPeration result
+ int idx; //Index of a symbol in the string
+ struct stat localFStat; //Local file information
+
+ if (client == NULL) {
+ errBox("No connection established");
+ return;
+ }
+ local = destFile->selectedName();
+ if (local == "") {
+ errBox("No file slected");
+ return;
+ }
+ result = stat(local, &localFStat);
+ if (result < 0) {
+ errBox(tr("Wrong file selected ") + local + tr(" ") +
+ tr(strerror(errno)));
+ return;
+ }
+ idx = local.findRev('/');
+ if (idx > 0) {
+ file2get = local.right(local.length() - idx - 1);
+ }
+ else
+ file2get = local;
+
+ odebug << "Copy " << local << " to " << file2get << oendl;
+ progressStatus = 0;
+ fileProgress->setTotalSteps(localFStat.st_size / 1024);
+ fileProgress->reset();
+ status(tr("Sending file ") + local);
+ result = obexftp_put_file(client, local, file2get);
+ if (result < 0) {
+ log(local + QString(" send ERROR"));
+ errBox(local + QString(" send ERROR"));
+ status(local + QString(" send ERROR"));
+ }
+ else {
+ log(local + QString(" sent"));
+ status(local + QString(" sent"));
+ }
+}
+
/* connect with given uuid. re-connect every time */
int ObexFtpDialog::cli_connect_uuid(const uint8_t *uuid, int uuid_len)
{
@@ -261,7 +340,7 @@ int ObexFtpDialog::cli_connect_uuid(const uint8_t *uuid, int uuid_len)
client->quirks &= ~OBEXFTP_CONN_HEADER;
if (!use_path)
client->quirks &= ~OBEXFTP_SPLIT_SETPATH;
- for (retry = 0; retry < 3; retry++) {
+ for (retry = 0; retry < nRetries; retry++) {
/* Connect */
switch (transport) {
case OBEX_TRANS_IRDA:
@@ -309,10 +388,8 @@ void ObexFtpDialog::log(const char* str)
void ObexFtpDialog::incProgress()
{
- odebug << "Progress " << progressStatus << oendl;
- if (progressStatus < MAX_PROGRESS) {
+ if (progressStatus < fileProgress->totalSteps())
fileProgress->setProgress(progressStatus++);
- }
}
void ObexFtpDialog::doneProgress()
diff --git a/noncore/net/opietooth/manager/obexftpdialog.h b/noncore/net/opietooth/manager/obexftpdialog.h
index b13efe5..7000f61 100644
--- a/noncore/net/opietooth/manager/obexftpdialog.h
+++ b/noncore/net/opietooth/manager/obexftpdialog.h
@@ -56,10 +56,12 @@ namespace OpieTooth {
int progressStatus; //Progress status
Opie::Ui::OFileSelector* destFile; //Destination file or directory
QVBoxLayout* localLayout; //Window layout
+ int nRetries; //Number of retries (on connection)
private slots:
void slotBrowse();
void slotCd(QListViewItem* item);
void getFile();
+ void putFile();
void updateDir(const QString& newdir);
};
};
diff --git a/noncore/net/opietooth/manager/obexftpdialogbase.cpp b/noncore/net/opietooth/manager/obexftpdialogbase.cpp
index 0640511..dd54b5f 100644
--- a/noncore/net/opietooth/manager/obexftpdialogbase.cpp
+++ b/noncore/net/opietooth/manager/obexftpdialogbase.cpp
@@ -1,7 +1,7 @@
/****************************************************************************
** Form implementation generated from reading ui file 'obexftpdialogbase.ui'
**
-** Created: Sun Mar 19 16:47:24 2006
+** Created: Tue Mar 21 00:29:33 2006
** by: The User Interface Compiler (uic)
**
** WARNING! All changes made in this file will be lost!
@@ -11,11 +11,11 @@
#include <qcombobox.h>
#include <qheader.h>
#include <qlabel.h>
-#include <qlineedit.h>
#include <qlistview.h>
#include <qmultilineedit.h>
#include <qprogressbar.h>
#include <qpushbutton.h>
+#include <qspinbox.h>
#include <qtabwidget.h>
#include <qwidget.h>
#include <qlayout.h>
@@ -35,7 +35,7 @@ ObexFtpDialogBase::ObexFtpDialogBase( QWidget* parent, const char* name, bool m
{
if ( !name )
setName( "ObexFtpDialogBase" );
- resize( 221, 396 );
+ resize( 267, 312 );
setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, sizePolicy().hasHeightForWidth() ) );
setCaption( tr( "Browse device" ) );
ObexFtpDialogBaseLayout = new QVBoxLayout( this );
@@ -49,35 +49,43 @@ ObexFtpDialogBase::ObexFtpDialogBase( QWidget* parent, const char* name, bool m
filesLayout->setSpacing( 0 );
filesLayout->setMargin( 0 );
- Layout9 = new QVBoxLayout;
- Layout9->setSpacing( 6 );
- Layout9->setMargin( 0 );
+ Layout13 = new QGridLayout;
+ Layout13->setSpacing( 6 );
+ Layout13->setMargin( 0 );
fileList = new QListView( files, "fileList" );
fileList->addColumn( tr( "Name" ) );
fileList->addColumn( tr( "Size" ) );
- Layout9->addWidget( fileList );
+
+ Layout13->addWidget( fileList, 0, 0 );
fileProgress = new QProgressBar( files, "fileProgress" );
- Layout9->addWidget( fileProgress );
- buttons = new QHBoxLayout;
- buttons->setSpacing( 6 );
- buttons->setMargin( 0 );
+ Layout13->addWidget( fileProgress, 1, 0 );
- getButton = new QPushButton( files, "getButton" );
- getButton->setText( tr( "Get file" ) );
- buttons->addWidget( getButton );
+ Layout11 = new QHBoxLayout;
+ Layout11->setSpacing( 6 );
+ Layout11->setMargin( 0 );
browseOK = new QPushButton( files, "browseOK" );
browseOK->setText( tr( "Browse" ) );
- buttons->addWidget( browseOK );
- Layout9->addLayout( buttons );
+ Layout11->addWidget( browseOK );
+
+ getButton = new QPushButton( files, "getButton" );
+ getButton->setText( tr( "Get file" ) );
+ Layout11->addWidget( getButton );
+
+ putButton = new QPushButton( files, "putButton" );
+ putButton->setText( tr( "Put file" ) );
+ Layout11->addWidget( putButton );
+
+ Layout13->addLayout( Layout11, 2, 0 );
statusBar = new QLabel( files, "statusBar" );
statusBar->setText( tr( "" ) );
- Layout9->addWidget( statusBar );
- filesLayout->addLayout( Layout9 );
+
+ Layout13->addWidget( statusBar, 3, 0 );
+ filesLayout->addLayout( Layout13 );
obexFtpTab->insertTab( files, tr( "Device" ) );
localFs = new QWidget( obexFtpTab, "localFs" );
@@ -85,21 +93,38 @@ ObexFtpDialogBase::ObexFtpDialogBase( QWidget* parent, const char* name, bool m
options = new QWidget( obexFtpTab, "options" );
- connRetries = new QLabel( options, "connRetries" );
- connRetries->setGeometry( QRect( 10, 45, 100, 16 ) );
- connRetries->setText( tr( "Retry to connect" ) );
+ QWidget* privateLayoutWidget = new QWidget( options, "Layout5" );
+ privateLayoutWidget->setGeometry( QRect( 45, 5, 162, 63 ) );
+ Layout5 = new QVBoxLayout( privateLayoutWidget );
+ Layout5->setSpacing( 6 );
+ Layout5->setMargin( 0 );
- nReries = new QLineEdit( options, "nReries" );
- nReries->setGeometry( QRect( 115, 40, 60, 23 ) );
+ Layout3 = new QHBoxLayout;
+ Layout3->setSpacing( 6 );
+ Layout3->setMargin( 0 );
- uuidLabel = new QLabel( options, "uuidLabel" );
- uuidLabel->setGeometry( QRect( 15, 20, 67, 15 ) );
+ uuidLabel = new QLabel( privateLayoutWidget, "uuidLabel" );
uuidLabel->setText( tr( "uuid type" ) );
+ Layout3->addWidget( uuidLabel );
- uuidType = new QComboBox( FALSE, options, "uuidType" );
+ uuidType = new QComboBox( FALSE, privateLayoutWidget, "uuidType" );
uuidType->insertItem( tr( "FBS" ) );
uuidType->insertItem( tr( "S45" ) );
- uuidType->setGeometry( QRect( 85, 10, 100, 30 ) );
+ Layout3->addWidget( uuidType );
+ Layout5->addLayout( Layout3 );
+
+ Layout4 = new QHBoxLayout;
+ Layout4->setSpacing( 6 );
+ Layout4->setMargin( 0 );
+
+ connRetries = new QLabel( privateLayoutWidget, "connRetries" );
+ connRetries->setText( tr( "Retry to connect" ) );
+ Layout4->addWidget( connRetries );
+
+ nReries = new QSpinBox( privateLayoutWidget, "nReries" );
+ nReries->setButtonSymbols( QSpinBox::PlusMinus );
+ Layout4->addWidget( nReries );
+ Layout5->addLayout( Layout4 );
obexFtpTab->insertTab( options, tr( "Options" ) );
browse = new QWidget( obexFtpTab, "browse" );
@@ -114,11 +139,11 @@ ObexFtpDialogBase::ObexFtpDialogBase( QWidget* parent, const char* name, bool m
// tab order
setTabOrder( obexFtpTab, fileList );
- setTabOrder( fileList, getButton );
- setTabOrder( getButton, browseOK );
- setTabOrder( browseOK, uuidType );
- setTabOrder( uuidType, nReries );
- setTabOrder( nReries, browseLog );
+ setTabOrder( fileList, browseOK );
+ setTabOrder( browseOK, getButton );
+ setTabOrder( getButton, putButton );
+ setTabOrder( putButton, uuidType );
+ setTabOrder( uuidType, browseLog );
}
/*
diff --git a/noncore/net/opietooth/manager/obexftpdialogbase.h b/noncore/net/opietooth/manager/obexftpdialogbase.h
index 3a4937a..32a313d 100644
--- a/noncore/net/opietooth/manager/obexftpdialogbase.h
+++ b/noncore/net/opietooth/manager/obexftpdialogbase.h
@@ -1,7 +1,7 @@
/****************************************************************************
** Form interface generated from reading ui file 'obexftpdialogbase.ui'
**
-** Created: Sun Mar 19 16:46:33 2006
+** Created: Tue Mar 21 00:28:12 2006
** by: The User Interface Compiler (uic)
**
** WARNING! All changes made in this file will be lost!
@@ -16,12 +16,12 @@ class QHBoxLayout;
class QGridLayout;
class QComboBox;
class QLabel;
-class QLineEdit;
class QListView;
class QListViewItem;
class QMultiLineEdit;
class QProgressBar;
class QPushButton;
+class QSpinBox;
class QTabWidget;
class QWidget;
@@ -37,23 +37,27 @@ public:
QWidget* files;
QListView* fileList;
QProgressBar* fileProgress;
- QPushButton* getButton;
QPushButton* browseOK;
+ QPushButton* getButton;
+ QPushButton* putButton;
QLabel* statusBar;
QWidget* localFs;
QWidget* options;
- QLabel* connRetries;
- QLineEdit* nReries;
QLabel* uuidLabel;
QComboBox* uuidType;
+ QLabel* connRetries;
+ QSpinBox* nReries;
QWidget* browse;
QMultiLineEdit* browseLog;
protected:
QVBoxLayout* ObexFtpDialogBaseLayout;
QVBoxLayout* filesLayout;
- QVBoxLayout* Layout9;
- QHBoxLayout* buttons;
+ QGridLayout* Layout13;
+ QHBoxLayout* Layout11;
+ QVBoxLayout* Layout5;
+ QHBoxLayout* Layout3;
+ QHBoxLayout* Layout4;
QHBoxLayout* browseLayout;
};
diff --git a/noncore/net/opietooth/manager/obexftpdialogbase.ui b/noncore/net/opietooth/manager/obexftpdialogbase.ui
index 86e87e4..b372b9d 100644
--- a/noncore/net/opietooth/manager/obexftpdialogbase.ui
+++ b/noncore/net/opietooth/manager/obexftpdialogbase.ui
@@ -11,8 +11,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>221</width>
- <height>396</height>
+ <width>267</width>
+ <height>312</height>
</rect>
</property>
<property stdset="1">
@@ -76,9 +76,9 @@
<class>QLayoutWidget</class>
<property stdset="1">
<name>name</name>
- <cstring>Layout9</cstring>
+ <cstring>Layout13</cstring>
</property>
- <vbox>
+ <grid>
<property stdset="1">
<name>margin</name>
<number>0</number>
@@ -87,7 +87,7 @@
<name>spacing</name>
<number>6</number>
</property>
- <widget>
+ <widget row="0" column="0" >
<class>QListView</class>
<column>
<property>
@@ -122,18 +122,18 @@
<cstring>fileList</cstring>
</property>
</widget>
- <widget>
+ <widget row="1" column="0" >
<class>QProgressBar</class>
<property stdset="1">
<name>name</name>
<cstring>fileProgress</cstring>
</property>
</widget>
- <widget>
+ <widget row="2" column="0" >
<class>QLayoutWidget</class>
<property stdset="1">
<name>name</name>
- <cstring>buttons</cstring>
+ <cstring>Layout11</cstring>
</property>
<hbox>
<property stdset="1">
@@ -148,6 +148,17 @@
<class>QPushButton</class>
<property stdset="1">
<name>name</name>
+ <cstring>browseOK</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Browse</string>
+ </property>
+ </widget>
+ <widget>
+ <class>QPushButton</class>
+ <property stdset="1">
+ <name>name</name>
<cstring>getButton</cstring>
</property>
<property stdset="1">
@@ -159,16 +170,16 @@
<class>QPushButton</class>
<property stdset="1">
<name>name</name>
- <cstring>browseOK</cstring>
+ <cstring>putButton</cstring>
</property>
<property stdset="1">
<name>text</name>
- <string>Browse</string>
+ <string>Put file</string>
</property>
</widget>
</hbox>
</widget>
- <widget>
+ <widget row="3" column="0" >
<class>QLabel</class>
<property stdset="1">
<name>name</name>
@@ -179,7 +190,7 @@
<string></string>
</property>
</widget>
- </vbox>
+ </grid>
</widget>
</vbox>
</widget>
@@ -205,88 +216,116 @@
<string>Options</string>
</attribute>
<widget>
- <class>QLabel</class>
- <property stdset="1">
- <name>name</name>
- <cstring>connRetries</cstring>
- </property>
- <property stdset="1">
- <name>geometry</name>
- <rect>
- <x>10</x>
- <y>45</y>
- <width>100</width>
- <height>16</height>
- </rect>
- </property>
- <property stdset="1">
- <name>text</name>
- <string>Retry to connect</string>
- </property>
- </widget>
- <widget>
- <class>QLineEdit</class>
+ <class>QLayoutWidget</class>
<property stdset="1">
<name>name</name>
- <cstring>nReries</cstring>
+ <cstring>Layout5</cstring>
</property>
<property stdset="1">
<name>geometry</name>
<rect>
- <x>115</x>
- <y>40</y>
- <width>60</width>
- <height>23</height>
+ <x>45</x>
+ <y>5</y>
+ <width>162</width>
+ <height>63</height>
</rect>
</property>
- </widget>
- <widget>
- <class>QLabel</class>
- <property stdset="1">
- <name>name</name>
- <cstring>uuidLabel</cstring>
- </property>
- <property stdset="1">
- <name>geometry</name>
- <rect>
- <x>15</x>
- <y>20</y>
- <width>67</width>
- <height>15</height>
- </rect>
- </property>
- <property stdset="1">
- <name>text</name>
- <string>uuid type</string>
- </property>
- </widget>
- <widget>
- <class>QComboBox</class>
- <item>
- <property>
- <name>text</name>
- <string>FBS</string>
+ <vbox>
+ <property stdset="1">
+ <name>margin</name>
+ <number>0</number>
</property>
- </item>
- <item>
- <property>
- <name>text</name>
- <string>S45</string>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>6</number>
</property>
- </item>
- <property stdset="1">
- <name>name</name>
- <cstring>uuidType</cstring>
- </property>
- <property stdset="1">
- <name>geometry</name>
- <rect>
- <x>85</x>
- <y>10</y>
- <width>100</width>
- <height>30</height>
- </rect>
- </property>
+ <widget>
+ <class>QLayoutWidget</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>Layout3</cstring>
+ </property>
+ <hbox>
+ <property stdset="1">
+ <name>margin</name>
+ <number>0</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>6</number>
+ </property>
+ <widget>
+ <class>QLabel</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>uuidLabel</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>uuid type</string>
+ </property>
+ </widget>
+ <widget>
+ <class>QComboBox</class>
+ <item>
+ <property>
+ <name>text</name>
+ <string>FBS</string>
+ </property>
+ </item>
+ <item>
+ <property>
+ <name>text</name>
+ <string>S45</string>
+ </property>
+ </item>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>uuidType</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget>
+ <class>QLayoutWidget</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property stdset="1">
+ <name>margin</name>
+ <number>0</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>6</number>
+ </property>
+ <widget>
+ <class>QLabel</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>connRetries</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Retry to connect</string>
+ </property>
+ </widget>
+ <widget>
+ <class>QSpinBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>nReries</cstring>
+ </property>
+ <property stdset="1">
+ <name>buttonSymbols</name>
+ <enum>PlusMinus</enum>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
</widget>
</widget>
<widget>
@@ -323,10 +362,10 @@
<tabstops>
<tabstop>obexFtpTab</tabstop>
<tabstop>fileList</tabstop>
- <tabstop>getButton</tabstop>
<tabstop>browseOK</tabstop>
+ <tabstop>getButton</tabstop>
+ <tabstop>putButton</tabstop>
<tabstop>uuidType</tabstop>
- <tabstop>nReries</tabstop>
<tabstop>browseLog</tabstop>
</tabstops>
</UI>