Hi Philippe, On 03/22/2011 08:10 AM, Philippe Nunes wrote: > --- > src/qsimcommand.cpp | 201 +++++++++++++++++++++++++++++++++++++++++++++++++-- > src/qsimcommand.h | 34 +++++++++ > 2 files changed, 228 insertions(+), 7 deletions(-) > > diff --git a/src/qsimcommand.cpp b/src/qsimcommand.cpp > index ecdf43f..46b633f 100644 > --- a/src/qsimcommand.cpp > +++ b/src/qsimcommand.cpp > @@ -69,6 +69,8 @@ public: > timerId = 0; > device = -1; > qualifier = 0; > + bufferSize = 0; > + dataLength = 0; > } > QSimCommandPrivate( QSimCommandPrivate *other ) > { > @@ -102,6 +104,15 @@ public: > device = other->device; > qualifier = other->qualifier; > extensionData = other->extensionData; > + bearerDesc = other->bearerDesc; > + bufferSize = other->bufferSize; > + dataLength = other->dataLength; > + apn = other->apn; > + uti = other->uti; > + userLogin = other->userLogin; > + userPassword = other->userPassword; > + destAddress = other->destAddress; > + localAddress = other->localAddress; > } > > bool flag( int bit ) const > @@ -165,7 +176,15 @@ public: > int device; > int qualifier; > QByteArray extensionData; > - > + QByteArray bearerDesc; > + ushort bufferSize; > + uint dataLength; > + QByteArray apn; > + QByteArray uti; > + QString userLogin; > + QString userPassword; > + QByteArray destAddress; > + QByteArray localAddress; > }; > > > @@ -612,7 +631,7 @@ QSimMenuItem& QSimMenuItem::operator=( const QSimMenuItem & value ) > \enum QSimCommand::Device > This enum defines the source or destination device for a SIM command, according > to 3GPP TS 11.14, section 12.7. > - > + \ Not that we care about qdoc, but this doesn't seem useful > \value Keypad Keypad device > \value Display Display device > \value Earpiece Earpiece device > @@ -2202,6 +2221,86 @@ void QSimCommand::setTimerId( int id ) > dwrite()->timerId = id; > } > > +ushort QSimCommand::bufferSize() const > +{ > + return d->bufferSize; > +} > + > +void QSimCommand::setBufferSize( ushort value ) > +{ > + dwrite()->bufferSize = value; > +} > + > +uint QSimCommand::dataLength() const > +{ > + return d->dataLength; > +} > + > +void QSimCommand::setDataLength( uint value ) > +{ > + dwrite()->dataLength = value; > +} > + > +QString QSimCommand::userLogin() const > +{ > + return d->userLogin; > +} > + > +void QSimCommand::setUserLogin( const QString& value ) > +{ > + dwrite()->userLogin = value; > +} > + > +QString QSimCommand::userPassword() const > +{ > + return d->userPassword; > +} > + > +void QSimCommand::setUserPassword( const QString& value ) > +{ > + dwrite()->userPassword = value; > +} > + > +QByteArray QSimCommand::uti() const > +{ > + return d->uti; > +} > + > +void QSimCommand::setUti( const QByteArray& value ) > +{ > + dwrite()->uti = value; > +} > + > +QByteArray QSimCommand::bearerDesc() const > +{ > + return d->bearerDesc; > +} > + > +void QSimCommand::setBearerDesc( const QByteArray& value ) > +{ > + dwrite()->bearerDesc = value; > +} > + > +QByteArray QSimCommand::destAddress() const > +{ > + return d->destAddress; > +} > + > +void QSimCommand::setDestAddress( const QByteArray& value ) > +{ > + dwrite()->destAddress = value; > +} > + > +QByteArray QSimCommand::apn() const > +{ > + return d->apn; > +} > + > +void QSimCommand::setApn( const QByteArray& value ) > +{ > + dwrite()->apn = value; > +} > + > /*! > Copy the QSimCommand object \a value. > */ > @@ -3045,6 +3144,62 @@ void _qtopiaphone_writeTimerValue( QByteArray& data, uint value ) > } > #define writeTimerValue _qtopiaphone_writeTimerValue > > +// Write a Bearer description field. > +static void writeBearerDesc( QByteArray& data, const QByteArray& bearerDesc ) > +{ > + if ( !bearerDesc.isEmpty() ) { > + data += (char)0x35; > + writeBerLength( data, bearerDesc.length() ); > + data += bearerDesc; > + } > +} > + > +// Write a Network Access Name field as specified in TS 23.003 > +static void writeApn( QByteArray& data, const QByteArray& apn ) > +{ > + if ( !apn.isEmpty() ) { > + data += (char)0x47; > + writeBerLength( data, apn.length() ); > + data += apn; > + } I'm not particularly picky on phonesim coding style, but lets at least try to be semi-consistent with indentation. phonesim uses 4 spaces for indentation (just because that's what the original Trolltech/Nokia code used). So lets at least try to stick to that ;) > +} > + > +// Write a Buffer size field. > +static void writeBufferSize( QByteArray& data, ushort size ) > +{ > + if ( size ) { > + data += 0x39; > + data += 0x02; > + data += (char)(size >> 8); > + data += (char)size; > + } > +} > + > +// Write a data length field. > +static void writeDataLength( QByteArray& data, uint value ) > +{ > + data += 0x37; > + data += 0x01; > + data += (char) value; > +} > + > +static void writeUti( QByteArray& data, const QByteArray& uti ) > +{ > + if ( !uti.isEmpty() ) { > + data += (char)0x3C; > + writeBerLength( data, uti.length() ); > + data += uti; > + } > +} > + > +static void writeOtherAddress( QByteArray& data, const QByteArray& otherAddress ) > +{ > + if ( !otherAddress.isEmpty() ) { > + data += (char)0x3E; > + writeBerLength( data, otherAddress.length() ); > + data += otherAddress; > + } And another variation with 3 tabs, why is this one special ;) > +} > /*! > \enum QSimCommand::ToPduOptions > This enum defines additional options to use when encoding SIM commands with QSimCommand::toPdu(). > @@ -3324,18 +3479,50 @@ QByteArray QSimCommand::toPdu( QSimCommand::ToPduOptions options ) const > if ( !text().isEmpty() || ( options & QSimCommand::EncodeEmptyStrings ) != 0 ) > writeEFADN( data, text(), options, 0x05 ); > writeIcon( data, iconId(), iconSelfExplanatory(), true ); > - if ( !number().isEmpty() ) > - writeEFADNNumber( data, number() ); > - if ( !subAddress().isEmpty() ) > - writeSubAddress( data, subAddress() ); > + > + writeBearerDesc( data, bearerDesc() ); > + writeBufferSize( data, bufferSize() ); > + > + if ( !apn().isEmpty() ) { > + writeApn( data, apn() ); > + } > + > + if ( !userLogin().isEmpty() ) { > + writeTextString( data, userLogin(), QSimCommand::NoPduOptions, 0x0D ); > + } > + > + if ( !userPassword().isEmpty() ) { > + writeTextString( data, userPassword(), QSimCommand::NoPduOptions, 0x0D ); > + } > + writeUti( data, uti() ); > + writeOtherAddress( data, destAddress() ); > writeTextAttribute( data, textAttribute() ); > } > break; > > - case CloseChannel: > case ReceiveData: > + { > + if ( !text().isEmpty() || ( options & QSimCommand::EncodeEmptyStrings ) != 0 ) > + writeEFADN( data, text(), options, 0x05 ); > + writeDataLength( data, dataLength() ); > + writeIcon( data, iconId(), iconSelfExplanatory(), true ); > + writeTextAttribute( data, textAttribute() ); > + } > + break; > + > case SendData: > { > + if ( !text().isEmpty() || ( options & QSimCommand::EncodeEmptyStrings ) != 0 ) > + writeEFADN( data, text(), options, 0x05 ); > + writeIcon( data, iconId(), iconSelfExplanatory(), true ); > + data += extData; > + writeTextAttribute( data, textAttribute() ); > + } > + break; > + > + case CloseChannel: > + case GetChannelStatus: > + { > if ( !text().isEmpty() || ( options & QSimCommand::EncodeEmptyStrings ) != 0 ) > writeEFADN( data, text(), options, 0x05 ); > writeIcon( data, iconId(), iconSelfExplanatory(), true ); > diff --git a/src/qsimcommand.h b/src/qsimcommand.h > index eadd768..2c55339 100644 > --- a/src/qsimcommand.h > +++ b/src/qsimcommand.h > @@ -215,6 +215,16 @@ public: > Network = 0x83 > }; > > + enum OpenChannelQualifier { > + OpenchannelOnDemand = 0x00, > + OpenchannelImmediate = 0x01, > + }; > + > + enum SendDataQualifier { > + SendDataStoreData = 0x00, > + SendDataImmediately = 0x01, > + }; > + > int commandNumber() const; > void setCommandNumber( int value ); > > @@ -362,6 +372,30 @@ public: > int qualifier() const; > void setQualifier( int value ); > > + QByteArray bearerDesc() const; > + void setBearerDesc( const QByteArray& value ); > + > + ushort bufferSize() const; > + void setBufferSize( ushort value ); > + > + uint dataLength() const; > + void setDataLength( uint value ); > + > + QByteArray apn() const; > + void setApn( const QByteArray& value ); > + > + QByteArray destAddress() const; > + void setDestAddress( const QByteArray& value ); > + > + QString userLogin() const; > + void setUserLogin( const QString& value ); > + > + QString userPassword() const; > + void setUserPassword( const QString& value ); > + > + QByteArray uti() const; > + void setUti( const QByteArray& value ); > + > QByteArray extensionData() const; > void setExtensionData( QByteArray value ); > Regards, -Denis