Aide - Recherche - Membres - Calendrier
Version complète : DmGetNextDatabaseByTypeCreator ?
Les Forums de PalmAttitude.org > GENERAL PalmOS > Développement sous PalmOS
blueberry
bonjour,

d'après la doc, DmGetNextDatabaseByTypeCreator est sensé trouver toute les bases mêmes si elles sont sur des cartes d'extension. pourtant dans mon cas, ça ne les trouve pas sad.gif

une idée ?
olivier101
CITATION(blueberry)
d'après la doc, DmGetNextDatabaseByTypeCreator est sensé trouver toute les bases mêmes si elles sont sur des cartes d'extension.

Les cartes dont parle la doc en question ne sont pas des cartes d'extension mais des "cartes RAM", concept inventé par palm pour perturber les programmeurs puisque toutes les machines palm à ce jour ont une et une seule carte RAM...

Si tu veux accéder aux fichiers sur la carte mémoire, il faut utiliser l'API VFS
blueberry
ah. icon_cry2.gif
apparemment il faut que j'utilise VFSFileDBGetRecord pour récupérer l'enregistrement dans un .pdb.
Par contre, je ne vois pas d'itérateur pour récupérer le contenu d'un répertoire ? (liste des fichiers)

merci
Patrice
VFSDirEntryEnumerate()
blueberry
dans la série RTFM, merci icon_bla.gif
Patrice
You're welcome icon_lol2.gif

Si ça t'intéresse, je peux poster le bout de code que j'utilise pour rechercher toutes les bases Métro dans le répertoire ad hoc dans toutes les cartes mémoires disponibles...
Guy-Lux
Ca l'interesse !!! Ca l'interesse !!! anim_grin.gif
Patrice
A un détail près : en fait, ce code ne va pas chercher sur toutes les cartes mémoire mais seulement sur la première où le répertoire "Métro" existe. Mais ça peut s'adapter, évidemment...

La fonction de listage remplit (avec AddDBRecord) une liste créée en mémoire. Les bases trouvées sont stockées dans une structure dbRecord où je conserve le nom et la version (grosso modo). A vous d'adapter pour votre usage.
CODE
#define APP_DB_FOLDER  "/PALM/Programs/metro"

#define APP_CREATOR_ID  'MTro'



static UInt16     VFSvolRefNum = vfsInvalidVolRef;

char        sBuf[160];        // General use buffers

char        sBuf2[160];



// ---------------------------------------------------

// Find the right VFS volume number and store it

// vfsInvalidVolRef if none available (no VFS/no card)

// Find the first volume available

// Better if we find one where the Metro path exists

// Return true if found the path

// ---------------------------------------------------

static Boolean FindVFSVolume(void)

{

 UInt32       info;

 UInt16       volRefNum;

 UInt32       volIterator = vfsIteratorStart;

 FileRef      dirRef;



 // Default = no VFS volume available

 VFSvolRefNum = vfsInvalidVolRef;



 // Try the /PALM/Programs/metro directory on expansion cards

 // Check VFS feature first

 if (FtrGet(sysFileCVFSMgr, vfsFtrIDVersion, &info) == errNone)

 {

   // Loop on all expansion cards

   while (volIterator != vfsIteratorStop)

   {

     // Check for the metro directory

     if (VFSVolumeEnumerate(&volRefNum, &volIterator) == errNone)

     {

       // Save first volume available

       if (VFSvolRefNum == vfsInvalidVolRef)

       {

         VFSvolRefNum = volRefNum;

       }

       // Better still: a volume with our path exists

       if (VFSFileOpen(volRefNum, APP_DB_FOLDER, vfsModeRead, &dirRef) == errNone)

       {

         VFSvolRefNum = volRefNum;

         VFSFileClose(dirRef);

         // Stop loop on first match

         return true;

       }

     }

   }

 }

 return false;

}



// ---------------------------------------------------

// Build path name

// ---------------------------------------------------

static void MakePathName(Char * pathName, Char * fileName)

{

 StrCopy(pathName, APP_DB_FOLDER);

 StrCat(pathName, "/");

 StrCat(pathName, fileName);

}



// ----------------------------

// Databases list fill function

// ----------------------------

static void FillDBList(FormPtr form, ListPtr list)

{

 DBRECORD          dbRecord;

 // Database exploration (in VFS card)

 FileRef           dirRef;

 UInt32            fileIterator;

 FileInfoType      fileInfo;

 FileRef           dbfile;



 // Try the /PALM/Programs/metro directory on expansion cards

 if (FindVFSVolume())

 {

   // Open the metro directory

   if (VFSFileOpen(VFSvolRefNum, APP_DB_FOLDER, vfsModeRead, &dirRef) == errNone)

   {

     fileIterator        = expIteratorStart;

     fileInfo.nameBufLen = 64;

     fileInfo.nameP      = sBuf;



     // Iterate over the files in the directory

     while (fileIterator != expIteratorStop)

     {

       // Get next file

       if(VFSDirEntryEnumerate(dirRef, &fileIterator, &fileInfo) == errNone)

       {

         // Make an entry for the list

         StrCopy(dbRecord.dbName, fileInfo.nameP);

         dbRecord.dbType = APP_EXPANSION_ID;

         dbRecord.dbOld  = 0;



         // Open database to get its name and version

         MakePathName(sBuf2, fileInfo.nameP);



         // Open file

         if (VFSFileOpen(VFSvolRefNum, sBuf2, vfsModeRead, &dbfile) == errNone)

         {

           type = 0;

           // Read a good part of the header

           if (VFSFileRead(dbfile, 0xA8, sBuf2, NULL) == errNone)

           {

             // Store base name

             StrNCopy(dbRecord.dbCity, sBuf2, 32);

             dbRecord.dbCity[32] = 0;

             // Get version

             MemMove(&vers, sBuf2 + 0x22, 2);

             // Check version

             if (vers < APP_CUR_VER || vers >= APP_MAX_VER)

             {

               // Remember it's old

               dbRecord.dbOld = 1;

             }

             // Get creator ID

             MemMove(&type, sBuf2 + 0x40, 4);

           }



           // Close file

           VFSFileClose(dbfile);



           // Check DB creator

           if (type != APP_CREATOR_ID)

           {

             continue;

           }

         }

         else break;



         // Add record to list

         AddDBRecord(&size, &count, &dbRecord);

       }

     }

     // Close file

     VFSFileClose(dirRef);

   }

 }

}

Enjoy anim_wink.gif
Guy-Lux
Ouach ! Merci Patrice. sourire.gif
blueberry
super merci ! l'astuce pour récupérer le CreatorID est intéressante. J'avais commencé par vérifier l'extension de tous les fichiers, puis uniquement pour les .pdb les ouvrir afin de récupérer dans les propriétés le CreatorID - ta solution est plus simple (sauf que je ne sais pas d'où sorte ces magic numbers (0xA8, ....).

Autre question, si je propose dans mon appli des PDB que l'utilisateur peut installer sur sa carte mémoire. Comment vais je savoir où il les mets ? à la racine si le gars n'est pas un informaticien, où dans /PALM/Programs/xxx si le gars sait utiliser FileZ et qu'il respecte les normes Palm... 8O

Concrêtement, puis-je imposer à un néophyte de déplacer les PDB à un endroit précis ? ou dois-je lire de façon récursive toute la carte à la recherche des fichiers ???

merci
Patrice
CITATION(blueberry)
super merci ! l'astuce pour récupérer le CreatorID est intéressante. J'avais commencé par vérifier l'extension de tous les fichiers, puis uniquement pour les .pdb les ouvrir afin de récupérer dans les propriétés le CreatorID - ta solution est plus simple (sauf que je ne sais pas d'où sorte ces magic numbers (0xA8, ....).

Le format des bases est documenté... L'avantage de lire comme ça est surtout que c'est monstrueusement plus rapide que d'utiliser la lecture PDB du palm...

CITATION(blueberry)
Autre question, si je propose dans mon appli des PDB que l'utilisateur peut installer sur sa carte mémoire. Comment vais je savoir où il les mets ? à la racine si le gars n'est pas un informaticien, où dans /PALM/Programs/xxx si le gars sait utiliser FileZ et qu'il respecte les normes Palm...  8O  

Concrêtement, puis-je imposer à un néophyte de déplacer les PDB à un endroit précis ? ou dois-je lire de façon récursive toute la carte à la recherche des fichiers ???

Question difficile... Pour mes softs, j'ai fait mon choix : je force un répertoire spécifique. Mais c'est une source d'ennuis (d'où la publication de "Folder", qui peut te servir aussi anim_wink.gif ). Donc dans le dernier que j'ai écrit, j'explore aussi le répertoire par défaut : /PALM/Launcher, ce qui devrait couvrir 99.9% des possibilités.
blueberry
... je reste persuadé que ma belle-mère avec son Palm III est incapable de comprendre l'arborescence sous sa carte SD.
je crois que je vais lire sur plusieurs répertoires prédéfinis, un peu comme tu dis :

palm
palmprogram
palmlauncher
palmplayboy (c'est le nom de mon appli)
oupsman
CITATION(blueberry)
... je reste persuadé que ma belle-mère avec son Palm III est incapable de comprendre l'arborescence sous sa carte SD.


Sans vouloir chipoter l'exemple, le palm III ne peut pas lire de SD. A la rigueur des smartmédias, mais pas les SD
Patrice
1) / n'est pas un répertoire "valide" pour des fichiers palm (guidelines officielles)
CITATION(blueberry)
palm
palmprogram
palmlauncher
2) Pour les gens qui n'y comprennent rien et ne cherchent pas les ennuis, /PALM/Launcher suffit.
CITATION(blueberry)
palmplayboy (c'est le nom de mon appli)
3) Le répertoire pour les données d'un programme devrait se trouver toujours sous /PALM/Program (guidelines officielles)
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.