From 03cc372eac638f066800c45d6929b2b50701f36e Mon Sep 17 00:00:00 2001
From: pin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Date: Wed, 7 Jul 2010 11:40:22 +0000
Subject: [PATCH] =?utf8?q?refactoring=20:=20ajout=20d'un=20d=C3=A9corateur?=
 =?utf8?q?=20pour=20lire=20des=20donn=C3=A9es=20sans=20chager=20la=20posit?=
 =?utf8?q?ion=20de=20lecture=20dans=20le=20fichier.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

git-svn-id: https://svn.cri.ensmp.fr/svn/minwii/trunk@274 fe552daf-6dbe-4428-90eb-1537e0879342
---
 src/minwii/logfilereader.py | 55 +++++++++++++++++--------------------
 1 file changed, 25 insertions(+), 30 deletions(-)

diff --git a/src/minwii/logfilereader.py b/src/minwii/logfilereader.py
index 29425f7..a08855a 100755
--- a/src/minwii/logfilereader.py
+++ b/src/minwii/logfilereader.py
@@ -15,6 +15,14 @@ import pygame
 
 SUPPORTED_FILE_HEADER = 'ENV winwii log format version : 1.0'
 
+def inplaceread(m) :
+    def readinplace(self, *args, **kw) :
+        self.savePos()
+        ret = m(self, *args, **kw)
+        self.recallPos()
+        return ret
+    return readinplace
+
 class LogFileReader(object) :
     """
     classe utilitaire pour l'accès aux données d'un fichier de log MinWii.
@@ -29,93 +37,80 @@ class LogFileReader(object) :
         else :
             self.logfile = logfile
         
+        self.__pos = 0
+        
         firstline = self.next()
         assert firstline == SUPPORTED_FILE_HEADER
-        
     
+    def savePos(self) :
+        self.__pos = self.logfile.tell()
+        self.logfile.seek(0)
+    
+    def recallPos(self) :
+        self.logfile.seek(self.__pos)
+    
+    @inplaceread
     def getSongFile(self) :
         "retourne le chemin d'accès au fichier musicxml de la chanson"
-        f = self.logfile
-        pos = f.tell()
-
-        f.seek(0)
         for l in self :
             if l.startswith('APP chanson :') :
                 break
         songfile = l.split(':', 1)[1].strip()
-        f.seek(pos)
         return songfile
     
+    @inplaceread
     def getSoundFontFile(self) :
         "retourne le chemin d'accès au fichier de la soundfont (*.sf2)"
-        f = self.logfile
-        pos = f.tell()
-        f.seek(0)
         for l in self :
             if l.startswith('ENV soundfont :') :
                 break
         soundFontFile = l.split(':', 1)[1].strip()
-        f.seek(pos)
         return soundFontFile
-
+    
+    @inplaceread
     def getBank(self) :
         "retourne le paramètre bank du synthétiseur (entier)"
-        f = self.logfile
-        pos = f.tell()
-        f.seek(0)
         for l in self :
             if l.startswith('APP bank :') :
                 break
-        f.seek(pos)
         bank = l.split(':', 1)[1].strip()
         return int(bank)
     
+    @inplaceread
     def getPreset(self) :
         "retourne le paramètre preset du synthétiseur (entier)"
-        f = self.logfile
-        pos = f.tell()
-        f.seek(0)
         for l in self :
             if l.startswith('APP preset :') :
                 break
-        f.seek(pos)
         preset = l.split(':', 1)[1].strip()
         return int(preset)
 
+    @inplaceread
     def getScreenResolution(self) :
         "retourne la résolution écran (tuple de deux entiers)"
-        f = self.logfile
-        pos = f.tell()
-        f.seek(0)
         for l in self :
             if l.startswith('ENV résolution écran :') :
                 break
         screenResolution = eval(l.split(':', 1)[1].strip())
-        f.seek(pos)
         return screenResolution
     
+    @inplaceread
     def getMode(self) :
         "retourne le niveau de difficulté"
-        f = self.logfile
-        pos = f.tell()
         for l in self :
             if l.startswith('APP mode :') :
                 break
             
         mode = l.split(':', 1)[1].strip()
-        f.geek(pos)
         return mode
     
+    @inplaceread
     def getFirstEventTicks(self) :
         "retourne le timecode du premier événement (entier)"
-        f = self.logfile
-        pos = f.tell()
-        f.seek(0)
         for l in self :
             if l.startswith('EVT ') :
                 break
         firstTicks = int(l.split(None, 2)[1])
-        f.seek(pos)
         return firstTicks
     
     def __del__(self) :
-- 
2.20.1