diff options
author | James Prestwood <james.prestwood@linux.intel.com> | 2017-11-08 09:23:50 -0800 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2017-11-08 20:57:15 -0600 |
commit | 11aee794f17584b1e2d3744b823776fea8b72624 (patch) | |
tree | 163dfcf7cf708d3809566318b8e27851dcbe6c5a | |
parent | ba183294afa32d67b077b7d8cf343ea623798fed (diff) | |
download | phonesim-11aee794f17584b1e2d3744b823776fea8b72624.tar.gz |
simfs: Added support for ISim file systems
-rw-r--r-- | src/simfilesystem.cpp | 100 | ||||
-rw-r--r-- | src/simfilesystem.h | 11 |
2 files changed, 89 insertions, 22 deletions
diff --git a/src/simfilesystem.cpp b/src/simfilesystem.cpp index a23d0a0..0e5c2a9 100644 --- a/src/simfilesystem.cpp +++ b/src/simfilesystem.cpp @@ -133,7 +133,20 @@ static SimFileInfo const knownFiles[] = {0, 0, 0, 0, FILE_TYPE_TRANSPARENT} }; -SimFileSystem::SimFileSystem( SimRules *rules, SimXmlNode& e ) +static SimFileInfo const isimFiles[] = +{ + // TS 31.103 + {"6F02", 0, "EFimpi", 0x14ff44, FILE_TYPE_TRANSPARENT}, + {"6F03", 0, "EFdomain", 0x14ff44, FILE_TYPE_TRANSPARENT}, + {"6FAD", 0, "EFad", 0x14ff44, FILE_TYPE_TRANSPARENT}, + {"6F06", 0, "EFarr", 0x14ff44, FILE_TYPE_TRANSPARENT}, + {"6F07", 0, "EFist", 0x14ff44, FILE_TYPE_TRANSPARENT}, + {"6F09", 0, "EFpcscf", 0x14ff44, FILE_TYPE_TRANSPARENT}, + {"6FD5", 0, "EFgbabp", 0x14ff44, FILE_TYPE_TRANSPARENT}, + {0, 0, 0, 0, FILE_TYPE_TRANSPARENT} +}; + +SimFileSystem::SimFileSystem( SimRules *rules, SimXmlNode& e, enum file_system_type fstype ) : QObject( rules ) { this->rules = rules; @@ -141,7 +154,12 @@ SimFileSystem::SimFileSystem( SimRules *rules, SimXmlNode& e ) currentItem = rootItem; // Create all of the standard directories. - const SimFileInfo *info = knownFiles; + const SimFileInfo *info; + if (fstype == FILE_SYSTEM_TYPE_ISIM) { + info = isimFiles; + } else { + info = knownFiles; + } SimFileItem *dirItem = 0; while ( info->fileid ) { QString fileid = info->fileid; @@ -162,20 +180,33 @@ SimFileSystem::SimFileSystem( SimRules *rules, SimXmlNode& e ) QString fileid = resolveFileId( name ); int access = findItemAccess( name ); enum file_type type = findItemFileType( name ); - SimFileItem *parent = findItemParent( fileid ); - if ( parent ) { - SimFileItem *item; - item = findItem( fileid.right(4) ); - if ( !item ) - item = new SimFileItem( fileid.right(4), parent, access, type ); - else - qDebug() << "File" << name << "defined multiple times"; - item->setContents( data ); - QString size = child->getAttribute( "recordsize" ); - if ( !size.isEmpty() ) - item->setRecordSize( size.toInt() ); + + if ( fstype == FILE_SYSTEM_TYPE_DEFAULT) { + SimFileItem *parent = findItemParent( fileid ); + if ( parent ) { + SimFileItem *item; + item = findItem( fileid.right(4) ); + if ( !item ) + item = new SimFileItem( fileid.right(4), parent, access, type ); + else + qDebug() << "File" << name << "defined multiple times"; + item->setContents( data ); + QString size = child->getAttribute( "recordsize" ); + if ( !size.isEmpty() ) + item->setRecordSize( size.toInt() ); + } else { + qDebug() << "Could not find parent for" << name; + } } else { - qDebug() << "Could not find parent for" << name; + /* + * ISIM files wont have a parent dir set, so they are handled + * differently. + */ + QString name = child->getAttribute( "name" ); + QByteArray data = QAtUtils::fromHex( child->contents ); + QString fileid = resolveISimFileId( name ); + SimFileItem *item = new SimFileItem( fileid.right(4), rootItem, access, type); + item->setContents( data ); } } else { qDebug() << "Unknown filesystem command <" << child->tag << ">"; @@ -184,7 +215,8 @@ SimFileSystem::SimFileSystem( SimRules *rules, SimXmlNode& e ) } /* Select DFgsm initially */ - currentItem = findItem("7F20"); + if ( fstype == FILE_SYSTEM_TYPE_DEFAULT ) + currentItem = findItem("7F20"); } SimFileSystem::~SimFileSystem() @@ -192,7 +224,7 @@ SimFileSystem::~SimFileSystem() delete rootItem; } -void SimFileSystem::crsm( const QString& args ) +bool SimFileSystem::fileAccess( const QString& args, QString& resp ) { // Extract the arguments to the command. uint posn = 0; @@ -428,13 +460,26 @@ void SimFileSystem::crsm( const QString& args ) // Send the response information. if ( sw1 != 0 ) { - QString resp; - resp = "+CRSM: " + QString::number(sw1) + "," + QString::number(sw2); + resp = QString::number(sw1) + "," + QString::number(sw2); if ( !response.isEmpty() ) resp += "," + response; - rules->respond( resp ); } - if ( ok ) + + return ok; +} + +void SimFileSystem::crsm( const QString& args ) +{ + bool ok; + QString crsm = "+CRSM: "; + QString resp; + ok = fileAccess( args, resp ); + + crsm += resp; + + rules->respond( crsm ); + + if (ok) rules->respond( "OK" ); else rules->respond( "ERROR" ); @@ -526,6 +571,19 @@ QString SimFileSystem::resolveFileId( const QString& _fileid ) const } } +QString SimFileSystem::resolveISimFileId( const QString& name ) const +{ + const SimFileInfo *info = (const SimFileInfo *)isimFiles; + while ( info->fileid ) { + if ( name == info->name ) { + QString fileid = info->fileid; + return fileid; + } + ++info; + } + return QString(""); +} + int SimFileSystem::findItemAccess( const QString& _fileid ) const { QString fileid = _fileid; diff --git a/src/simfilesystem.h b/src/simfilesystem.h index 150416f..477c6c7 100644 --- a/src/simfilesystem.h +++ b/src/simfilesystem.h @@ -24,6 +24,11 @@ class SimFileItem; +enum file_system_type { + FILE_SYSTEM_TYPE_DEFAULT, + FILE_SYSTEM_TYPE_ISIM +}; + enum file_type { FILE_TYPE_TRANSPARENT = 0, FILE_TYPE_LINEAR_FIXED = 1, @@ -52,12 +57,14 @@ class SimFileSystem : public QObject { Q_OBJECT public: - SimFileSystem( SimRules *rules, SimXmlNode& e ); + SimFileSystem( SimRules *rules, SimXmlNode& e, enum file_system_type type = FILE_SYSTEM_TYPE_DEFAULT ); ~SimFileSystem(); // Execute an AT+CRSM command against the filesystem. void crsm( const QString& args ); + bool fileAccess( const QString& args, QString& resp ); + // Find an item with a specific id. SimFileItem *findItem( const QString& fileid ) const; @@ -77,6 +84,8 @@ public: // Resolve a file identifier to its full path from the root directory. QString resolveFileId( const QString& fileid ) const; + QString resolveISimFileId( const QString& _fileid ) const; + private: SimRules *rules; SimFileItem *rootItem; |