PyXR

c:\projects\bitpim\src \ phones \ com_sanyomedia.py



0001 ### BITPIM
0002 ###
0003 ### Copyright (C) 2004, 2005 Stephen Wood <sawecw@users.sf.net>
0004 ###
0005 ### This program is free software; you can redistribute it and/or modify
0006 ### it under the terms of the BitPim license as detailed in the LICENSE file.
0007 ###
0008 ### $Id: com_sanyomedia.py 3707 2006-11-29 04:49:48Z sawecw $
0009 
0010 """Common code for Sanyo Media transfers"""
0011 
0012 # standard modules
0013 
0014 import time
0015 import cStringIO
0016 import re
0017 
0018 # BitPim Modules
0019 import com_sanyo
0020 import com_brew
0021 import com_phone
0022 import p_sanyomedia
0023 import prototypes
0024 
0025 class SanyoMedia:
0026     "Download and upload media (ringers/wallpaper) from Sanyo Phones"
0027 
0028     FIRST_MEDIA_DIRECTORY=2
0029     LAST_MEDIA_DIRECTORY=3
0030     CAMERA_DIRECTORY=1
0031     
0032     # Directories:
0033     #    1: Camera Pictures and Videos.  MDM - Video
0034     #                                    V   - Picture
0035     #    2: Downloads
0036     #    3: Cable uploads
0037     #    4: Duplicate of directory 1 ??
0038 
0039     imagelocations=(
0040         # offset, directory #, indexflag, type, maximumentries
0041         ( 300, 1, 1, "images", 30),
0042         ( 300, 1, 0, "camera", 30),
0043         )
0044 
0045     wallpaperexts=(".jpg", ".png", ".mp4", ".3g2",".JPG")
0046     ringerexts=(".mid", ".qcp", ".mp3", ".m4a", ".pmd", ".bin")
0047 
0048     def __init__(self):
0049         pass
0050 
0051     def getmediaindices(self, results):
0052         com_sanyo.SanyoPhonebook.getmediaindices(self, results)
0053         ringermedia=results['ringtone-index']
0054         imagemedia=results['wallpaper-index']
0055 
0056         copypat=re.compile(r"(.*)\.(\d+)$")
0057         for idir in range(self.FIRST_MEDIA_DIRECTORY, self.LAST_MEDIA_DIRECTORY+1):
0058             self.log("Indexing directory "+`idir`)
0059             req=self.protocolclass.sanyochangedir()
0060             req.dirindex=idir
0061             res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse)
0062             req=self.protocolclass.sanyonumfilesrequest()
0063             try:
0064                 res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse)
0065             except com_sanyo.SanyoCommandException, ex:
0066                 if ex.errnum!=121:
0067                     raise
0068                 self.log("Skipping directory "+`idir`)
0069                 continue
0070             
0071             self.log("Directory "+`idir`+", File Count="+`res.count`)
0072             nfiles=res.count
0073             for ifile in range(nfiles):
0074                 req=self.protocolclass.sanyomediafilenamerequest()
0075                 req.index=ifile
0076                 res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse)
0077                 name=res.filename
0078                 orgname=name
0079                 
0080                 unique=False
0081                 while not unique:
0082                     unique=True
0083                     for idx in imagemedia.keys():
0084                         if name==imagemedia[idx]['name']:
0085                             matchresult=copypat.match(name)
0086                             if matchresult:
0087                                 copycount=int(matchresult.group(2))+1
0088                                 name=matchresult.group(1)+"."+str(copycount)
0089                             else:
0090                                 name=name+".1"
0091                             # Keep looping until sure we have unique name
0092                             unique=False
0093                             break
0094                 if idir==self.CAMERA_DIRECTORY:
0095 
0096                     if res.num3==0:    # Original Camera Picture
0097                         # Could convert filename to to a date
0098                         imagemedia[ifile+1000*idir]={'name': name, 'origin': "camera"}
0099                     else:
0100                         # Wallet pictures
0101                         imagemedia[res.num3]={'name': name, 'origin': "images"}
0102                 else:
0103                     idx=ifile+1000*idir
0104 
0105                     # Make this more elegant later
0106                     iswallpaper=0
0107                     for ext in self.wallpaperexts:
0108                         if orgname.endswith(ext):
0109                             imagemedia[idx]={'name': name, 'origin': "images"}
0110                             iswallpaper=1
0111                             break
0112                     if not iswallpaper:
0113                         for ext in self.ringerexts:
0114                             if orgname.endswith(ext):
0115                                 ringermedia[idx]={'name': name, 'origin': "ringers"}
0116                                 break
0117 
0118         results['ringtone-index']=ringermedia
0119         results['wallpaper-index']=imagemedia
0120         return
0121             
0122         
0123     def getmediaindex(self, builtins, maps, results, key):
0124         media=com_sanyo.SanyoPhonebook.getmediaindex(self, builtins, maps, results, key)
0125         # the maps
0126         type=''
0127         for offset,indexfile,indextype,type,maxentries in maps:
0128             req=self.protocolclass.sanyochangedir()
0129             req.dirindex=indexfile
0130             res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse)
0131             req=self.protocolclass.sanyonumfilesrequest()
0132             res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse)
0133             for ifile in range(res.count):
0134                 req=self.protocolclass.sanyomediafilenamerequest()
0135                 req.index=ifile
0136                 res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse)
0137                 media[ifile+offset]={'name': res.filename, 'origin': "camera"}
0138 
0139         results[key]=media
0140         return media
0141 
0142     def getindex(self, location):
0143         "Get an index of files in a Sanyo directory"
0144         index={}
0145         req=self.protocolclass.sanyochangedir()
0146         req.dirindex=location
0147         res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse)
0148 
0149         req=self.protocolclass.sanyonumfilesrequest()
0150         res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse)
0151         for ifile in range(res.count):
0152             req=self.protocolclass.sanyomediafilenamerequest()
0153             req.index=ifile
0154             res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse)
0155             index[ifile]=res.filename
0156 
0157         return index
0158         
0159     def getmedia(self, exts, result, key):
0160         media={}
0161         # Essentially duplicating code in getmediaindices
0162         copypat=re.compile(r"(.*)\.(\d+)$")
0163         if key=="wallpapers":
0164             mediaindex=result['wallpaper-index']
0165         else:
0166             mediaindex=result['ringtone-index']
0167             
0168         for idir in range(self.FIRST_MEDIA_DIRECTORY, self.LAST_MEDIA_DIRECTORY+1):
0169             self.log("Reading "+key+" from directory "+`idir`)
0170             req=self.protocolclass.sanyochangedir()
0171             req.dirindex=idir
0172             res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse)
0173             req=self.protocolclass.sanyonumfilesrequest()
0174             try:
0175                 res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse)
0176             except com_sanyo.SanyoCommandException, ex:
0177                 if ex.errnum!=121:
0178                     raise
0179                 self.log("Skipping directory "+`idir`)
0180                 continue
0181 
0182             self.log("Directory "+`idir`+", File Count="+`res.count`)
0183             nfiles=res.count
0184             for ifile in range(nfiles):
0185                 req=self.protocolclass.sanyomediafilenamerequest()
0186                 req.index=ifile
0187                 res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse)
0188                 # self.log(res.filename+": "+`res.num1`+" "+`res.num2`+" "+`res.num3`+" "+`res.num4`)
0189 
0190                 orgname=res.filename
0191                 if idir==self.CAMERA_DIRECTORY and res.num3!=0:
0192                     idx=res.num3
0193                 else:
0194                     idx=ifile+1000*idir
0195 
0196                 # Get the file if it has the right extension
0197                 for ext in exts:
0198                     if orgname.endswith(ext):
0199                         filename=mediaindex[idx]['name']
0200                         self.log("Retrieving file: "+orgname+", saving as "+filename)
0201                         try:
0202                             media[filename]=self.getsanyofilecontents(idir,ifile)
0203                         except (com_brew.BrewNoSuchFileException,com_brew.BrewBadPathnameException):
0204                             self.log("It was in the index, but not on the filesystem")
0205                         break
0206                     
0207         result[key]=media
0208         return result
0209                 
0210 
0211         
0212     def getmediaold(self, maps, result, key):
0213         media={}
0214         for offset,indexfile,indextype,type,maxentries in maps:
0215             index=self.getindex(indexfile)
0216             for i in index:
0217                 try:
0218                     media[index[i]]=self.getsanyofilecontents(indexfile,i)
0219                 except (com_brew.BrewNoSuchFileException,com_brew.BrewBadPathnameException):
0220                     self.log("It was in the index, but not on the filesystem")
0221                     
0222         result[key]=media
0223         return result
0224         
0225     def getwallpapers(self, result):
0226         return self.getmedia(self.wallpaperexts, result, 'wallpapers')
0227 
0228     def getringtones(self, result):
0229         return self.getmedia(self.ringerexts, result, 'ringtone')
0230 
0231     
0232     def getsanyofilecontents(self, directory, fileindex):
0233         "Get file # index from directory # directory"
0234         start=time.time()
0235         self.log("Getting file # "+`fileindex`+" from directory "+`directory`)
0236         desc="Reading "+`directory`+"/"+`fileindex`
0237 
0238         req=self.protocolclass.sanyochangedir()
0239         req.dirindex=directory
0240 
0241         res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse)
0242 
0243         req=self.protocolclass.sanyonumfilesrequest()
0244         res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse)
0245 
0246         # Should check that fileindex requested does not exceed number
0247         # of files in directory
0248 
0249         req=self.protocolclass.sanyomediafilenamerequest()
0250         req.index=fileindex
0251         res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse)
0252 
0253         req=self.protocolclass.sanyomediafragmentrequest()
0254         req.fileindex=fileindex
0255 
0256         # Can't find a way to get the file size so we can show progress
0257 
0258         data=cStringIO.StringIO()
0259         
0260         more=1
0261         counter=0
0262         filesize=0
0263         while more==1:
0264             counter+=1
0265             if counter%5==0:
0266                 self.progress(counter%250, 250, desc)
0267                 
0268             res=self.sendpbcommand(req,self.protocolclass.sanyomediafragmentresponse)
0269             data.write(res.data[0:res.length])
0270             more=res.more
0271             filesize+=res.length
0272 
0273         self.progress(1,1,desc)
0274 
0275         data=data.getvalue()
0276         end=time.time()
0277         if end-start>3:
0278             self.log("Read "+`filesize`+" bytes at "+`int(filesize/(end-start))`+" bytes/second")
0279 
0280         return data
0281     
0282 

Generated by PyXR 0.9.4