Aller au contenu

Chatbox - 73016 Messages. Spammers: neoskyriper (11850) . crash over ride (9414) . chronoss (9111) .

Load More
    Vous n'avez pas la permission pour chater.

    La ChatBox est un lieu de discussion instantanée pour parler de tout ce que vous voulez et à certaines questions COURTES, pour VOS PROBLÈMES utiliser le FORUM il est la pour ça merci de votre compréhension.

    Le site sera en maintenance bientôt pendant au moins 24H ... mise à jour


    Kasai07

    Code Explorer de rosalina (luma3ds)

    Messages recommandés

    explorer.c

    #include <3ds.h>
    #include "menus/explorer.h"
    #include "menus/tools.h"
    #include "mcu.h"
    #include "memory.h"
    #include "draw.h"
    #include "fmt.h"
    #include "utils.h"
    #include "ifile.h"
    
    #define MAP_BASE_1	0x08000000
    
    #define MAP_BASE_2 	0x10000000
    
    #define MAP_BASE_SIZE	0x100000
    
    #define MEMOP_FREE 		1
    #define MEMOP_ALLOC 	3
    	
    #define MEMPERM_READ 	1
    #define MEMPERM_WRITE 	2
    
    
    
    const char *strrchr(const char *src, int c)
    {
        char *src_c = (char *)src;
        while(*src_c != 0)
        {
            if(*src_c == c) return src_c;
            src_c++;
        }
    
        return NULL;
    }
    
    const char *get_ext(const char *filename) 
    {
        const char *dot = strrchr(filename, '.');
        if (!dot || dot == filename) return "";
        return dot + 1;
    }
    
    
    
    
    Dir_Name* Dir = (Dir_Name*)MAP_BASE_1;
    int sDir = 0;
    
    
    int *prev_index = (int *)0x080FFF00;
    int index = 0;
    int pos_index = 0;
    int pos = 0;
    
    char Path[512];
    
    
    bool FoFext[128];//File or Folder
    bool extcia[128];//File or Folder
    
    
    
    
    int loadFiles(int sDir)
    {
    	bool returnhomemenu = false;
    	reboot = false;
    	
    	while(true)
    	{
    		for(int i=0;i<128;i++)
    			FoFext[i] = true;
    		
    		Draw_Lock();
    		Draw_ClearFramebuffer();
    		Draw_FlushFramebuffer();
    		Draw_Unlock();
    		
    		Handle handle;
    		FS_Archive sdmcArchive;
    		FS_DirectoryEntry entry;
    		FS_Path dirPath = fsMakePath(PATH_ASCII, Dir[sDir].Path);
    		FSUSER_OpenArchive(&sdmcArchive, ARCHIVE_SDMC, fsMakePath(PATH_EMPTY, ""));
    		FSUSER_OpenDirectory(&handle, sdmcArchive, dirPath);
    		
    		u32 fileRead = 0;
    		int count = 0;
    		
    		while (true) {
    			
    			FSDIR_Read(handle, &fileRead, 1, (FS_DirectoryEntry*)&entry);
    			if (!fileRead) {
    				break;
    			}
    			
    			char name[262] = { 0 };
    			for (size_t i = 0; i < 262; i++) {
    				name[i] = entry.name[i] % 0xff;
    			}
    			 
    			memcpy(Dir[sDir].fileNames[count], name, 128);
    			
    			//folder or file
    			memcpy(Path, Dir[sDir].Path, 512);
    			strcat(Path, "/");
    			strcat(Path, Dir[sDir].fileNames[count]);
    			
    			Handle FoFHandle = 0;
    			Result ret = FSUSER_OpenFileDirectly(&FoFHandle, ARCHIVE_SDMC, fsMakePath(PATH_ASCII, ""), fsMakePath(PATH_ASCII, Path), FS_OPEN_READ, 0);
    			if (R_FAILED(ret)){
    				FoFext[count] = false;
    			}
    			
    			FSDIR_Close(FoFHandle);
    			svcCloseHandle(FoFHandle);
    			count++;
    		}
    		
    		
    		
    		
    		
    		while(true)
    		{
    			
    			
    			if(index==0)pos=0;
    			if(count>16)
    			{
    				if((pos+15)<index){
    					pos++; 
    					
    				}
    				if(pos>index)pos--;
    				if(index==count-1)pos=count-16;
    			}
    			Draw_Lock();
    			Draw_DrawString(10, 10, COLOR_TITLE, "Menu Explorer");
    			
    			for(int i = 0; i < count; i++)
    			{
    				Draw_DrawString(50, 40+(i*10), COLOR_BLACK, "                                                  ");
    				Draw_DrawFormattedString(50, 40+(i*10), i+pos == index ? COLOR_SEL : COLOR_WHITE, i+pos == index ? ">  %s" : "   %s",Dir[sDir].fileNames[i+pos]);
    				if(i+pos == index)Draw_DrawString(50, 40+(i*10),COLOR_SEL, ">");
    				Draw_DrawString( 5, 40+(i*10), COLOR_WHITE,(FoFext[i+pos] == true) ? "File  " : "Folder");
    				if(i==15)break;
    			}
    			Draw_FlushFramebuffer();
    			Draw_Unlock();
    			
    			u32 pressed = waitInputWithTimeout(1000);
    			if(pressed & BUTTON_A){
    				
    				if(FoFext[index])
    				{
    					reboot = true;
    					memcpy(Path, Dir[sDir].Path, 512);
    					strcat(Path, "/");
    					strcat(Path, Dir[sDir].fileNames[index]);
    					
    					const char * ext = get_ext(Dir[sDir].fileNames[index]);
    					
    					if(strcmp(ext ,"cia") == 0)
    						installCIA(Path, MEDIATYPE_SD);
    					
    					
    					continue;
    					
    				}
    				//memory path
    				memcpy(Dir[sDir+1].Path, Dir[sDir].Path, 512);
    				if(sDir>0)strcat(Dir[sDir+1].Path, "/");
    				strcat(Dir[sDir+1].Path, Dir[sDir].fileNames[index]);
    				sDir++;
    				//memory index previous
    				prev_index[pos_index] = index;
    				pos_index++;
    				index=0;
    				
    				break;
    				
    			} else if(pressed & BUTTON_DOWN){ 
    				index = (index == count-1) ? 0 : index+1;
    			} else if(pressed & BUTTON_UP){
    				index = (index == 0) ? count-1 : index-1;
    			} else if(pressed & BUTTON_B){
    				
    				
    				memcpy(Dir[sDir].Path, "", 2);
    				if(sDir == 0)returnhomemenu = true;
    				else sDir--;
    				
    				pos_index--;
    				index = prev_index[pos_index];
    				
    				break;
    				
    			} 
    			
    			
    		}
    		if(returnhomemenu && reboot)svcKernelSetState(7);
    		if(returnhomemenu)break;
    		
    		FSDIR_Close(handle);
    		svcCloseHandle(handle);
    		FSUSER_CloseArchive(sdmcArchive);
    	}
    	
    
    	return 0;
    }
    
    void Menu_Explorer()
    {	
    	u32 tmp = 0;
    	svcControlMemoryEx(&tmp, MAP_BASE_1, 0, MAP_BASE_SIZE, MEMOP_ALLOC, MEMPERM_READ | MEMPERM_WRITE, true);
    	memcpy(Dir[sDir].Path,"/", 2);
    	while (aptMainLoop())
    	{
    		loadFiles(sDir);
    		break;
    	}
    	amExit();
    	svcControlMemory(&tmp, MAP_BASE_1, 0, MAP_BASE_SIZE, MEMOP_FREE, 0);
    	return;
    }

    explorer.h

    #pragma once
    
    
    #include <3ds/types.h>
    #include "menu.h"
    
    #define MAX_FILES 256
    #define nullptr (void *)0
    
    typedef struct {
        char fileNames[128][128];
    	char Path[512];
    }Dir_Name;
    
    int loadFiles(int sDir);
    void Menu_Explorer();

     

    Modifié par Kasai07
    • Merci 1

    Partager ce message


    Lien à poster
    Partager sur d’autres sites

    Détails ?

    Partager ce message


    Lien à poster
    Partager sur d’autres sites
    if(pressed & BUTTON_A){
    			
    			strcat((char *)Dir[sDir+1].path, (char *)Dir[sDir].path);//je copie le path de Dir[0] dans Dir[1]
    			if(sDir)strcat((char *)Dir[sDir+1].path, DEFAULT_DIRECTORY);//j'insere "/" a la fin de Dir[1]
    			strcat((char *)Dir[sDir+1].path, (char *)Dir[sDir].fileNames[index]);//j'insere le nom de dossier a la fin de Dir[1]
    			loadFiles(sDir+1);//je lance la fontion pour ouvrir le dossier qui et le chemin de Dir[1]
    			memcpy(Dir[sDir+1].path,"", 2);//retour de fonction Dir[1] et remis a NULL car plus l'utilité et pour evité un bug
    			
    		}

    pour moi le pb viens peut etre de la

    • Merci 1

    Partager ce message


    Lien à poster
    Partager sur d’autres sites

    la seul erreur que j'ai c'est quand le path devient trop grand je pense

    du genre 

     

    \Nintendo 3DS\ff72e0e50ccc0094597bf91f33771a75\db1601064730da41534c333200035054\extdata\00000000\000002ce\00000000

    Modifié par Kasai07

    Partager ce message


    Lien à poster
    Partager sur d’autres sites

    pour comprendre un peu

     

    jai "/" dans Dir[0] "root sd" quand j'appuie A

    je copie le nom de dossier dans Dir[1] du coup j'ai "/nomdudossier"

    qui relance la fonction du coup je me sert de Dir[1] pour afficher ce qui se trouve dans ce dossier

    puis j'appuie A je recopie le nom de dossier dans Dir[2] du coup j'ai "/nomdedossier/nomdudossier2"

    mais j'ai toujours "/nomdudossier" dans Dir[1] et "/" dans Dir[0]

    Partager ce message


    Lien à poster
    Partager sur d’autres sites

    et tu veux purger tes variable ??

    Partager ce message


    Lien à poster
    Partager sur d’autres sites

    non juste savoir ou je plante quand j'ouvre trop de dossier

     

    Partager ce message


    Lien à poster
    Partager sur d’autres sites
    il y a 41 minutes, Kasai07 a dit :

    non juste savoir ou je plante quand j'ouvre trop de dossier

     

    je pense que ça plante car tes variables ne sont pas purger, lorsque tu réitère ta requêtes il prend les nouvelles valeur mais je pense cas un moment il sature d'ou purger tes variables.

    je suis pas un AS en C ou C++ mais essaye d'utiliser un memset dans ta boucle au debut ou a la fin je sais pas le C je connaît pas trop mais je pense qu'un memset t'aideras je pense

    Partager ce message


    Lien à poster
    Partager sur d’autres sites

    voila le code modifier et meme meilleur que le precedent plus de bug

    l'erreur etait du faite que je lancer trop de processus pour ouvrir des dossiers

    j'apellais  beaucoup trop la fonction "loadfiles"

     

    la cette fois c'est une boucle while qui a pris le relais du coup un seul processus pour la meme chose

     

    • Aimer 1

    Partager ce message


    Lien à poster
    Partager sur d’autres sites

    amelioration du code et correction des bug lors de l'ouverture de dossier

    Partager ce message


    Lien à poster
    Partager sur d’autres sites

    amelioration du curseur et de la position en sortant du dossier

    ajout d'une permission pour supprimer un titre

    reajustement de la sortie de l'explorateur apres avoir installer un cia

     

    et d'autre amelioration du code

    Modifié par Kasai07
    • Aimer 2

    Partager ce message


    Lien à poster
    Partager sur d’autres sites
    Le 17/09/2017 à 23:23, Kasai07 a dit :

    amelioration du curseur et de la position en sortant du dossier

    ajout d'une permission pour supprimer un titre

    reajustement de la sortie de l'explorateur apres avoir installer un cia

     

    et d'autre amelioration du code

    Tu fais fort et vivement la version finale ;)

    Partager ce message


    Lien à poster
    Partager sur d’autres sites

    Créer un compte ou se connecter pour commenter

    Vous devez être membre afin de pouvoir déposer un commentaire

    Créer un compte

    Créez un compte sur notre communauté. C’est facile !

    Créer un nouveau compte

    Se connecter

    Vous avez déjà un compte ? Connectez-vous ici.

    Connectez-vous maintenant

    Statut de vie du Forum


    Date de départ du Forum: August 06, 2017 00:47:51

    ModConsoles

    Stores / Magasins


    ×