1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
DWORD WINAPI ThreadDecompression (LPVOID)
{
MSG syn; // Variable message pour la syncronisation du thread
SetWindowText(LogHwnd,"Decompression"); // LogHwnd est un champ de texte
LireBinaire b; // un class qui gére les fichier a ma place
b.Ouvrir(OSFile.Path,GENERIC_READ, OPEN_EXISTING );// ouverture du fichier
if (b.Bon())
{
int Lettres;
int longeur;
int finalisation=0;
char* buffer ;
Lettres=b.LireChaineBinaire(0,9);
buffer = IntToChar(Lettres); // nombre de lettre codé
AddTextEdit(LogHwnd,buffer,"\r\nLettres : ");
delete buffer;
longeur=b.LireChaineBinaire(9,14);
buffer = IntToChar(longeur); // longeur de la longeur de bit qui contient la longeur du code
AddTextEdit(LogHwnd,buffer,"\r\nLongeur ecriture : ");
int alloc=puissance(longeur,2);
delete buffer;
buffer = IntToChar(alloc-1); // aproximation de la longeur max d'un code
AddTextEdit(LogHwnd,buffer,"\r\nLongeur maximal : ");
delete buffer;
finalisation=b.LireChaineBinaire(14,17);
buffer = IntToChar(finalisation); // bits pour faut un fichier en octet
AddTextEdit(LogHwnd,buffer,"\r\nFinalisation : ");
delete buffer;
SendDlgItemMessage(CompDlg, ID_PROGBAR , PBM_SETRANGE, 0, MAKELONG(0,Lettres));
SendDlgItemMessage(CompDlg, ID_PROGBAR, PBM_SETSTEP, 1, 0); // progress bar d'avancement
int PosBinFi=17;
int ITemp=0;
map<char,char*> Convention;
buffer = new char[alloc*2];
/* Lecture de la convention de fichier */
for(int y=0;y<Lettres;y++)
{
buffer[0]=b.LireChaineBinaire(PosBinFi,PosBinFi+8);
buffer[1]=0;
PosBinFi+=8;
ITemp=b.LireChaineBinaire(PosBinFi,PosBinFi+longeur);
PosBinFi+=longeur;
b.LireChaineBinaire(PosBinFi,PosBinFi+ITemp);
PosBinFi+=ITemp;
Convention[buffer[0]]=new char[ITemp+2];
strcpy(Convention[buffer[0]],b.ChaineBits);
strcat(buffer," : ");
strcat(buffer,b.ChaineBits);
AddTextEdit(LogHwnd,buffer,"\r\n");
SendDlgItemMessage(CompDlg, ID_PROGBAR, PBM_STEPIT, 0, 0);
}
delete buffer;
/* fin de lecture de convention */
AddTextEdit(LogHwnd,"Décodage du fichier ...","\r\n");
SendDlgItemMessage(CompDlg, ID_PROGBAR , PBM_SETRANGE, 0, MAKELONG(0,100));
SendDlgItemMessage(CompDlg, ID_PROGBAR, PBM_SETSTEP, 1, 0);
char FT[MAX_PATH];
CharSetPathApp(FT); // fichier temp
strcat(FT,"DTemp.txt");
FichierEcrire FiTemp;
FiTemp.Ouvrir(FT,GENERIC_WRITE,CREATE_ALWAYS);
buffer = new char[alloc+1];
ITemp=0;
char Text[100];
int PosChaiBinCur,PosChaiBinLast;
int PosChaiTex=0;
int LastBarSet=-1;
map<char,char*>::const_iterator x;
int FinFiBin = b.ObtenirTaille()*8 - finalisation ;
// boucle de décodage
while(PosBinFi<=FinFiBin)
{
b.LireChaineBinaire(PosBinFi,PosBinFi+1024);
PosChaiBinCur=0;
ITemp=0;
while(PosChaiBinCur<b.NBits)
{
buffer[ITemp]=b.ChaineBits[PosChaiBinCur];
buffer[ITemp+1]=0;
ITemp++;
PosChaiBinCur++;
// recherche dans le convention si le code existe
for(x=Convention.begin();x!=Convention.end();x++)
{
if(CharEgales(buffer,x->second))
{
if (PosChaiTex==99)
{
FiTemp.EcrireChaine(Text,PosChaiTex);
PosChaiTex=0;
}
Text[PosChaiTex]=x->first;
Text[PosChaiTex+1]=0;
PosChaiTex++;
ITemp=0;
PosChaiBinLast=PosChaiBinCur;
}
}
// si on est a la fin on quitte
if (PosBinFi+PosChaiBinCur>FinFiBin)
break;
}
PosBinFi+=PosChaiBinLast;
if (LastBarSet<(PosBinFi)*100/FinFiBin)
{
SendDlgItemMessage(CompDlg, ID_PROGBAR, PBM_SETPOS,(PosBinFi)*100/FinFiBin, 0);
LastBarSet=(PosBinFi)*100/FinFiBin;
// si on appui sur annuler le thread s'arret
PeekMessage(&syn,NULL,0,0,0);
if (syn.message==TSM_STOP_THREAD)
{
AddTextEdit(LogHwnd,"Arret"," ");
SendMessage(CompDlg,TSM_THREAD_STOPPER,0,0);
return 0;
}
}
if (PosBinFi+1>FinFiBin)
break;
}
FiTemp.EcrireChaine(Text,PosChaiTex);
FiTemp.Fermer();
AddTextEdit(LogHwnd,"Terminer.."," ");
b.Fermer();
b.Ouvrir(FT,GENERIC_READ, OPEN_EXISTING ); // chargement du fichier temp
if (b.Bon())
{
b.LireChaine(0,-1);
b.Chaine[b.Retour()]=0;
SetNullChar(b.Chaine,b.Retour()-1);
SetWindowText(EditHwnd,b.Chaine);
}
else
{
SetWindowText(EditHwnd,"Erreur a l'ouverture de");
AddTextEdit(EditHwnd,FT," ");
}
}
else
AddTextEdit(LogHwnd,"Le fichier ne peut pas étre ouvert !","\r\n");
b.Fermer();
SendMessage(CompDlg,TSM_THREAD_END,0,0);
return 1;
} |
Partager