Trees | Indices | Help |
|
---|
|
1 ### BITPIM 2 ### 3 ### Copyright (C) 2004, 2005 Stephen Wood <sawecw@users.sf.net> 4 ### 5 ### This program is free software; you can redistribute it and/or modify 6 ### it under the terms of the BitPim license as detailed in the LICENSE file. 7 ### 8 ### $Id: com_sanyomedia.py 3707 2006-11-29 04:49:48Z sawecw $ 9 10 """Common code for Sanyo Media transfers""" 11 12 # standard modules 13 14 import time 15 import cStringIO 16 import re 17 18 # BitPim Modules 19 import com_sanyo 20 import com_brew 21 import com_phone 22 import p_sanyomedia 23 import prototypes 2426 "Download and upload media (ringers/wallpaper) from Sanyo Phones" 27 28 FIRST_MEDIA_DIRECTORY=2 29 LAST_MEDIA_DIRECTORY=3 30 CAMERA_DIRECTORY=1 31 32 # Directories: 33 # 1: Camera Pictures and Videos. MDM - Video 34 # V - Picture 35 # 2: Downloads 36 # 3: Cable uploads 37 # 4: Duplicate of directory 1 ?? 38 39 imagelocations=( 40 # offset, directory #, indexflag, type, maximumentries 41 ( 300, 1, 1, "images", 30), 42 ( 300, 1, 0, "camera", 30), 43 ) 44 45 wallpaperexts=(".jpg", ".png", ".mp4", ".3g2",".JPG") 46 ringerexts=(".mid", ".qcp", ".mp3", ".m4a", ".pmd", ".bin") 47 5028152 com_sanyo.SanyoPhonebook.getmediaindices(self, results) 53 ringermedia=results['ringtone-index'] 54 imagemedia=results['wallpaper-index'] 55 56 copypat=re.compile(r"(.*)\.(\d+)$") 57 for idir in range(self.FIRST_MEDIA_DIRECTORY, self.LAST_MEDIA_DIRECTORY+1): 58 self.log("Indexing directory "+`idir`) 59 req=self.protocolclass.sanyochangedir() 60 req.dirindex=idir 61 res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse) 62 req=self.protocolclass.sanyonumfilesrequest() 63 try: 64 res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse) 65 except com_sanyo.SanyoCommandException, ex: 66 if ex.errnum!=121: 67 raise 68 self.log("Skipping directory "+`idir`) 69 continue 70 71 self.log("Directory "+`idir`+", File Count="+`res.count`) 72 nfiles=res.count 73 for ifile in range(nfiles): 74 req=self.protocolclass.sanyomediafilenamerequest() 75 req.index=ifile 76 res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse) 77 name=res.filename 78 orgname=name 79 80 unique=False 81 while not unique: 82 unique=True 83 for idx in imagemedia.keys(): 84 if name==imagemedia[idx]['name']: 85 matchresult=copypat.match(name) 86 if matchresult: 87 copycount=int(matchresult.group(2))+1 88 name=matchresult.group(1)+"."+str(copycount) 89 else: 90 name=name+".1" 91 # Keep looping until sure we have unique name 92 unique=False 93 break 94 if idir==self.CAMERA_DIRECTORY: 95 96 if res.num3==0: # Original Camera Picture 97 # Could convert filename to to a date 98 imagemedia[ifile+1000*idir]={'name': name, 'origin': "camera"} 99 else: 100 # Wallet pictures 101 imagemedia[res.num3]={'name': name, 'origin': "images"} 102 else: 103 idx=ifile+1000*idir 104 105 # Make this more elegant later 106 iswallpaper=0 107 for ext in self.wallpaperexts: 108 if orgname.endswith(ext): 109 imagemedia[idx]={'name': name, 'origin': "images"} 110 iswallpaper=1 111 break 112 if not iswallpaper: 113 for ext in self.ringerexts: 114 if orgname.endswith(ext): 115 ringermedia[idx]={'name': name, 'origin': "ringers"} 116 break 117 118 results['ringtone-index']=ringermedia 119 results['wallpaper-index']=imagemedia 120 return121 122124 media=com_sanyo.SanyoPhonebook.getmediaindex(self, builtins, maps, results, key) 125 # the maps 126 type='' 127 for offset,indexfile,indextype,type,maxentries in maps: 128 req=self.protocolclass.sanyochangedir() 129 req.dirindex=indexfile 130 res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse) 131 req=self.protocolclass.sanyonumfilesrequest() 132 res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse) 133 for ifile in range(res.count): 134 req=self.protocolclass.sanyomediafilenamerequest() 135 req.index=ifile 136 res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse) 137 media[ifile+offset]={'name': res.filename, 'origin': "camera"} 138 139 results[key]=media 140 return media141143 "Get an index of files in a Sanyo directory" 144 index={} 145 req=self.protocolclass.sanyochangedir() 146 req.dirindex=location 147 res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse) 148 149 req=self.protocolclass.sanyonumfilesrequest() 150 res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse) 151 for ifile in range(res.count): 152 req=self.protocolclass.sanyomediafilenamerequest() 153 req.index=ifile 154 res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse) 155 index[ifile]=res.filename 156 157 return index158160 media={} 161 # Essentially duplicating code in getmediaindices 162 copypat=re.compile(r"(.*)\.(\d+)$") 163 if key=="wallpapers": 164 mediaindex=result['wallpaper-index'] 165 else: 166 mediaindex=result['ringtone-index'] 167 168 for idir in range(self.FIRST_MEDIA_DIRECTORY, self.LAST_MEDIA_DIRECTORY+1): 169 self.log("Reading "+key+" from directory "+`idir`) 170 req=self.protocolclass.sanyochangedir() 171 req.dirindex=idir 172 res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse) 173 req=self.protocolclass.sanyonumfilesrequest() 174 try: 175 res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse) 176 except com_sanyo.SanyoCommandException, ex: 177 if ex.errnum!=121: 178 raise 179 self.log("Skipping directory "+`idir`) 180 continue 181 182 self.log("Directory "+`idir`+", File Count="+`res.count`) 183 nfiles=res.count 184 for ifile in range(nfiles): 185 req=self.protocolclass.sanyomediafilenamerequest() 186 req.index=ifile 187 res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse) 188 # self.log(res.filename+": "+`res.num1`+" "+`res.num2`+" "+`res.num3`+" "+`res.num4`) 189 190 orgname=res.filename 191 if idir==self.CAMERA_DIRECTORY and res.num3!=0: 192 idx=res.num3 193 else: 194 idx=ifile+1000*idir 195 196 # Get the file if it has the right extension 197 for ext in exts: 198 if orgname.endswith(ext): 199 filename=mediaindex[idx]['name'] 200 self.log("Retrieving file: "+orgname+", saving as "+filename) 201 try: 202 media[filename]=self.getsanyofilecontents(idir,ifile) 203 except (com_brew.BrewNoSuchFileException,com_brew.BrewBadPathnameException): 204 self.log("It was in the index, but not on the filesystem") 205 break 206 207 result[key]=media 208 return result209 210 211213 media={} 214 for offset,indexfile,indextype,type,maxentries in maps: 215 index=self.getindex(indexfile) 216 for i in index: 217 try: 218 media[index[i]]=self.getsanyofilecontents(indexfile,i) 219 except (com_brew.BrewNoSuchFileException,com_brew.BrewBadPathnameException): 220 self.log("It was in the index, but not on the filesystem") 221 222 result[key]=media 223 return result224 227 230 231233 "Get file # index from directory # directory" 234 start=time.time() 235 self.log("Getting file # "+`fileindex`+" from directory "+`directory`) 236 desc="Reading "+`directory`+"/"+`fileindex` 237 238 req=self.protocolclass.sanyochangedir() 239 req.dirindex=directory 240 241 res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse) 242 243 req=self.protocolclass.sanyonumfilesrequest() 244 res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse) 245 246 # Should check that fileindex requested does not exceed number 247 # of files in directory 248 249 req=self.protocolclass.sanyomediafilenamerequest() 250 req.index=fileindex 251 res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse) 252 253 req=self.protocolclass.sanyomediafragmentrequest() 254 req.fileindex=fileindex 255 256 # Can't find a way to get the file size so we can show progress 257 258 data=cStringIO.StringIO() 259 260 more=1 261 counter=0 262 filesize=0 263 while more==1: 264 counter+=1 265 if counter%5==0: 266 self.progress(counter%250, 250, desc) 267 268 res=self.sendpbcommand(req,self.protocolclass.sanyomediafragmentresponse) 269 data.write(res.data[0:res.length]) 270 more=res.more 271 filesize+=res.length 272 273 self.progress(1,1,desc) 274 275 data=data.getvalue() 276 end=time.time() 277 if end-start>3: 278 self.log("Read "+`filesize`+" bytes at "+`int(filesize/(end-start))`+" bytes/second") 279 280 return data
Trees | Indices | Help |
|
---|
Generated by Epydoc 3.0.1 on Sun Jan 24 16:22:37 2010 | http://epydoc.sourceforge.net |