Changeset 14 for mymrc

Show
Ignore:
Timestamp:
07/03/07 01:01:21 (5 years ago)
Author:
dlefevre
Message:

Night build:
- Added Navigation on the server
- Added xml data generation
- Added SQL operations
- Added player controler

Location:
mymrc/trunk/mymrc/src
Files:
12 added
6 modified

Legend:

Unmodified
Added
Removed
  • mymrc/trunk/mymrc/src/mobileclient/client.py

    r8 r14  
     1from mobileclient.clientengine import ClientEngine 
     2from settings.settings import Settings 
     3import os 
     4import thread 
    15 
     6def printd( aString ): 
     7    print aString 
    28 
    3 class Client( object ): 
    4     def __init__(self): 
    5         pass 
     9class Client: 
     10    def __init__(self, aConnection ): 
     11        self._iConn = aConnection[0] 
     12        self._iConn.setblocking( 1 ) 
     13        self._iEngine = ClientEngine( self.send ) 
     14        self._iObserverPid = 0 
     15        self._iBufferSize = int(Settings().get("protocol", "BufferSize")) 
     16        print self._iBufferSize 
     17        self.start_observer() 
     18        printd( 'New connection with: ' + str(aConnection[1]) ) 
     19 
     20    def _observer(self): 
     21        # set PID to be able to kill the thread 
     22        try: 
     23            self._iObserverPid = os.getpid() 
     24        except: 
     25            pass 
     26        while 1: 
     27            data = self._iConn.recv( self._iBufferSize ) 
     28            if not data: break 
     29            else: 
     30                self._iEngine.handle_event(data)                 
     31#        self._removeFromStack( aChannel ) 
     32        self._iConn.close( ) 
     33        self._iObserverPid = 0 
     34        printd("Connection closed: " + str( self._iConn ) )         
    635     
    7     def send(self): 
    8         pass 
     36    def send(self, aString): 
     37        print "Send" 
     38        print aString 
     39        try: 
     40            self._iConn.sendall(aString, self._iBufferSize) 
     41        except: 
     42            self._iConn.sendall(aString, 512) 
    943     
    1044    def receive(self): 
    1145        pass 
     46    
     47    def start_observer(self): 
     48        print "start_observer(self):" 
     49        thread.start_new_thread(self._observer, () ) 
     50     
     51    def stop_observer(self): 
     52        if self._iObserverPid: 
     53            os.popen("kill -9 "+str(self._iObserverPid)) 
     54     
     55    def __del__(self): 
     56        self._iEngine() 
     57        self._iConn.close() 
     58    
  • mymrc/trunk/mymrc/src/mobileclient/clientengine.py

    r8 r14  
    1  
    2  
    3 class ClientEngine( object ): 
     1from networking.packet import PacketBuilder 
     2from mobileclient.appuifw import ListBox, Form 
     3from settings.settings import Settings 
     4from settings.lang import Lang 
     5from mobileclient.opcode import OPCode 
     6from db.dbdriver import DBDriver 
     7from networking.packet import PacketParser 
     8from db.audioqueries import AudioQueries 
     9from controllers.audiocontroller import AudioController 
     10 
     11 
     12 
     13class VideoView(object): 
     14    def __init__(self, aViewStack, aActionStack, aListStack): 
     15        self._iViewStack = aViewStack 
     16        self._iActionStack = aActionStack 
     17        self._iListStack = aListStack 
     18     
     19    def main(self): 
     20        lb = ListBox(Lang().label('Video')) 
     21        actions = [] 
     22        id_list = [] 
     23        # Feed listbox 
     24        lb.addLabel(Lang().label('AllVideos')) 
     25        actions.append(lambda:None) 
     26        lb.addLabel(Lang().label('Playlists')) 
     27        actions.append(lambda:None) 
     28         
     29        # Feed options menu 
     30        lb.addCommand('options', Lang().label('Select'), OPCode()['SELECT']) 
     31        lb.addCommand('options', Lang().label('NowPlaying'), OPCode()['NOWPLAYING']) 
     32        lb.addCommand('options', Lang().label('Back'), OPCode()['BACK']) 
     33        self._iViewStack.append(lb.getList()) 
     34        self._iActionStack.append(actions) 
     35        self._iListStack.append(id_list) 
     36 
     37class DvdView(object): 
    438    def __init__(self): 
    539        pass 
     40 
     41    def main(self): 
     42        print "Dvd view" 
     43        pass 
     44     
     45         
     46class TvView(object): 
     47    def __init__(self): 
     48        pass 
     49     
     50    def main(self): 
     51        print "Tv view" 
     52        pass 
     53     
     54     
     55class AudioView(object): 
     56    def __init__(self, aViewStack, aActionStack, aListStack): 
     57        self._iViewStack = aViewStack 
     58        self._iActionStack = aActionStack 
     59        self._iListStack = aListStack 
     60        self._iDB = AudioQueries() 
     61     
     62    def main(self): 
     63        print "Audio main" 
     64        actions = [] 
     65        id_list = [] 
     66        lb = ListBox(Lang().label('Audio')) 
     67        # Feed listbox 
     68        lb.addLabel(Lang().label('AllSongs')) 
     69        actions.append( self.allSongs ) 
     70 
     71        lb.addLabel(Lang().label('Playlists')) 
     72        actions.append( self.playlists ) 
     73 
     74        lb.addLabel(Lang().label('Artists')) 
     75        actions.append( self.artists ) 
     76         
     77        lb.addLabel(Lang().label('Albums')) 
     78        actions.append( self.albums ) 
     79         
     80        lb.addLabel(Lang().label('Genres')) 
     81        actions.append( self.genres ) 
     82         
     83        # Feed options menu 
     84        lb.addCommand('select', Lang().label('Select'), OPCode()['SELECT']) 
     85        lb.addCommand('options', Lang().label('Select'), OPCode()['SELECT']) 
     86        lb.addCommand('options', Lang().label('NowPlaying'), OPCode()['NOWPLAYING']) 
     87        lb.addCommand('options', Lang().label('Back'), OPCode()['BACK']) 
     88        lb.addCommand('back', Lang().label('Back'), OPCode()['BACK']) 
     89        self._iActionStack.append(actions) 
     90        self._iViewStack.append(lb.getList()) 
     91        self._iListStack.append(id_list) 
     92     
     93    def allSongs(self): 
     94        print "Audio all songs" 
     95         
     96        lb = ListBox(Lang().label('AllSongs')) 
     97        actions = [] 
     98        id_list = [] 
     99         
     100        db = AudioQueries() 
     101        resultset = db.allSongs() 
     102        #resultset = db.execute(query) 
     103 
     104        # feed list 
     105        for song in resultset.fetchall(): 
     106            print song 
     107            lb.addLabel(song[3]) 
     108            id_list.append(song[0]) 
     109         
     110        # Feed options menu 
     111        lb.addCommand('options', Lang().label('Play'), OPCode()['PLAY']) 
     112        lb.addCommand('options', Lang().label('AddToPlaylist'), OPCode()['DISCONNECT']) 
     113        lb.addCommand('options', Lang().label('NowPlaying'), OPCode()['NOWPLAYING']) 
     114        lb.addCommand('options', Lang().label('Back'), OPCode()['BACK']) 
     115        lb.addCommand('back', Lang().label('Back'), OPCode()['BACK']) 
     116        lb.addCommand('select', Lang().label('Play'), OPCode()['PLAY']) 
     117        self._iActionStack.append(actions) 
     118        self._iViewStack.append(lb.getList()) 
     119        self._iListStack.append(id_list) 
     120      
     121     
     122    def artists(self): 
     123        print "Audio Artists" 
     124        lb = ListBox(Lang().label('Artists')) 
     125        actions = [] 
     126        id_list = [] 
     127         
     128        db = AudioQueries() 
     129        resultset = db.artists() 
     130         
     131        # feed list 
     132        for artist in resultset.fetchall(): 
     133            print artist 
     134            lb.addLabel(artist) 
     135            actions.append(lambda:self.artistAlbums(artist)) 
     136         
     137        # Feed options menu 
     138        lb.addCommand('options', Lang().label('Select'), OPCode()['SELECT']) 
     139        lb.addCommand('options', Lang().label('AddToPlaylist'), OPCode()['PLNEW']) 
     140        lb.addCommand('options', Lang().label('NowPlaying'), OPCode()['NOWPLAYING']) 
     141        lb.addCommand('options', Lang().label('Back'), OPCode()['BACK']) 
     142        lb.addCommand('back', Lang().label('Back'), OPCode()['BACK']) 
     143        lb.addCommand('select', Lang().label('Select'), OPCode()['SELECT']) 
     144         
     145        self._iActionStack.append(actions) 
     146        self._iViewStack.append(lb.getList()) 
     147        self._iListStack.append(id_list) 
     148     
     149     
     150    def artistAlbums(self, aArtistName): 
     151        print "Audio %s album" %(aArtistName) 
     152        lb = ListBox(aArtistName) 
     153        actions = [] 
     154        id_list = [] 
     155 
     156        # all songs 
     157        lb.addLabel(Lang().label('AllSongs')) 
     158        actions.append(lambda:self.artistAllSongs()) 
     159 
     160         
     161        db = AudioQueries() 
     162        resultset = db.artistAlbums(aArtistName) 
     163         
     164        # feed list 
     165        for album in resultset.fetchall(): 
     166            lb.addLabel(album) 
     167            actions.append(lambda:self.artistAlbumSongs(album)) 
     168                         
     169        # Feed options menu 
     170        lb.addCommand('options', Lang().label('Select'), OPCode()['SELECT']) 
     171        lb.addCommand('options', Lang().label('AddToPlaylist'), OPCode()['PLNEW']) 
     172        lb.addCommand('options', Lang().label('NowPlaying'), OPCode()['NOWPLAYING']) 
     173        lb.addCommand('options', Lang().label('Back'), OPCode()['BACK']) 
     174        lb.addCommand('back', Lang().label('Back'), OPCode()['BACK']) 
     175        lb.addCommand('select', Lang().label('Select'), OPCode()['SELECT'])             
     176 
     177        self._iActionStack.append(actions) 
     178        self._iViewStack.append(lb.getList())  
     179        self._iListStack.append(id_list)    
     180     
     181     
     182    def artistAlbumSongs(self, aAlbum): 
     183        print "Audio artist album songs" 
     184        lb = ListBox(aAlbum) 
     185        actions = [] 
     186        id_list = [] 
     187         
     188        db = AudioQueries() 
     189        resultset = db.albumSongs(aAlbum) 
     190         
     191        # feed list 
     192        for song in resultset.fetchall(): 
     193            lb.addLabel(song[3]) 
     194             
     195        # Feed options menu 
     196        lb.addCommand('options', Lang().label('Play'), OPCode()['PLAY']) 
     197        lb.addCommand('options', Lang().label('AddToPlaylist'), OPCode()['PLNEW']) 
     198        lb.addCommand('options', Lang().label('NowPlaying'), OPCode()['NOWPLAYING']) 
     199        lb.addCommand('options', Lang().label('Back'), OPCode()['BACK']) 
     200        lb.addCommand('back', Lang().label('Back'), OPCode()['BACK']) 
     201        lb.addCommand('select', Lang().label('Play'), OPCode()['PLAY'])          
     202        self._iActionStack.append(actions) 
     203        self._iViewStack.append(lb.getList()) 
     204        self._iListStack.append(id_list) 
     205     
     206         
     207    def artistAllSongs(self): 
     208        print "Audio artist all songs" 
     209        artistName = "Unknown" 
     210        lb = ListBox(artistName) 
     211        actions = [] 
     212        id_list = [] 
     213         
     214        db = AudioQueries() 
     215        resultset = db.artistAllSongs(artistName) 
     216         
     217        # feed list 
     218        for song in resultset.fetchall(): 
     219            lb.addLabel(song[3]) 
     220             
     221        # Feed options menu 
     222        lb.addCommand('options', Lang().label('Play'), OPCode()['PLAY']) 
     223        lb.addCommand('options', Lang().label('AddToPlaylist'), OPCode()['DISCONNECT']) 
     224        lb.addCommand('options', Lang().label('NowPlaying'), OPCode()['NOWPLAYING']) 
     225        lb.addCommand('options', Lang().label('Back'), OPCode()['BACK']) 
     226        lb.addCommand('back', Lang().label('Back'), OPCode()['BACK']) 
     227        lb.addCommand('select', Lang().label('Play'), OPCode()['PLAY'])             
     228         
     229        self._iActionStack.append(actions) 
     230        self._iViewStack.append(lb.getList()) 
     231        self._iListStack.append(id_list) 
     232         
     233     
     234    def albums(self): 
     235        print "Audio album" 
     236        lb = ListBox(Lang().label('Albums')) 
     237        actions = [] 
     238        id_list = [] 
     239         
     240        db = AudioQueries() 
     241        resultset = db.albums() 
     242         
     243        # feed list 
     244        for album in resultset.fetchall(): 
     245            lb.addLabel(album) 
     246            actions.append(lambda:self.albumSongs(album)) 
     247             
     248        # Feed options menu 
     249        lb.addCommand('options', Lang().label('Select'), OPCode()['SELECT']) 
     250        lb.addCommand('options', Lang().label('AddToPlaylist'), OPCode()['PLNEW']) 
     251        lb.addCommand('options', Lang().label('NowPlaying'), OPCode()['NOWPLAYING']) 
     252        lb.addCommand('options', Lang().label('Back'), OPCode()['BACK']) 
     253        lb.addCommand('back', Lang().label('Back'), OPCode()['BACK']) 
     254        lb.addCommand('select', Lang().label('Select'), OPCode()['SELECT'])         
     255 
     256        self._iActionStack.append(actions) 
     257        self._iViewStack.append(lb.getList()) 
     258        self._iListStack.append(id_list) 
     259     
     260     
     261    def albumSongs(self, aAlbum): 
     262        print "Audio album songs" 
     263        lb = ListBox(aAlbum) 
     264        actions = [] 
     265        id_list = [] 
     266         
     267        db = AudioQueries() 
     268        resultset = db.albumSongs(aAlbum) 
     269         
     270        # feed list 
     271        for song in resultset.fetchall(): 
     272            lb.addLabel(song[3]) 
     273            actions.append(lambda:None) 
     274             
     275        # Feed options menu 
     276        lb.addCommand('options', Lang().label('Play'), OPCode()['PLAY']) 
     277        lb.addCommand('options', Lang().label('AddToPlaylist'), OPCode()['PLNEW']) 
     278        lb.addCommand('options', Lang().label('NowPlaying'), OPCode()['NOWPLAYING']) 
     279        lb.addCommand('options', Lang().label('Back'), OPCode()['BACK']) 
     280        lb.addCommand('back', Lang().label('Back'), OPCode()['BACK']) 
     281        lb.addCommand('select', Lang().label('Play'), OPCode()['PLAY'])   
     282         
     283        self._iActionStack.append(actions) 
     284        self._iViewStack.append(lb.getList()) 
     285         
     286     
     287    def genres(self): 
     288        print "Audio genres" 
     289        lb = ListBox(Lang().label('Genres')) 
     290        actions = [] 
     291        id_list = [] 
     292         
     293        db = AudioQueries() 
     294        resultset = db.genres() 
     295         
     296        # feed list 
     297        for genre in resultset.fetchall(): 
     298            lb.addLabel(genre) 
     299            actions.append(lambda:self.genreSongs(genre)) 
     300         
     301        # Feed options menu 
     302        lb.addCommand('options', Lang().label('Select'), OPCode()['SELECT']) 
     303        lb.addCommand('options', Lang().label('AddToPlaylist'), OPCode()['PLNEW']) 
     304        lb.addCommand('options', Lang().label('NowPlaying'), OPCode()['NOWPLAYING']) 
     305        lb.addCommand('options', Lang().label('Back'), OPCode()['BACK']) 
     306        lb.addCommand('back', Lang().label('Back'), OPCode()['BACK']) 
     307        lb.addCommand('select', Lang().label('Select'), OPCode()['SELECT']) 
     308 
     309        self._iActionStack.append(actions) 
     310        self._iViewStack.append(lb.getList()) 
     311        self._iListStack.append(id_list) 
     312         
     313     
     314    def genreSongs(self, aGenre): 
     315        print "Audio genres songs" 
     316        lb = ListBox(aGenre) 
     317        actions = [] 
     318        id_list = [] 
     319 
     320        db = AudioQueries() 
     321        resultset = db.genreSongs( aGenre ) 
     322         
     323        # feed list 
     324        for song in resultset.fetchall(): 
     325            lb.addLabel(song[3]) 
     326             
     327        # Feed options menu 
     328        lb.addCommand('options', Lang().label('Play'), OPCode()['PLAY']) 
     329        lb.addCommand('options', Lang().label('AddToPlaylist'), OPCode()['PLNEW']) 
     330        lb.addCommand('options', Lang().label('NowPlaying'), OPCode()['NOWPLAYING']) 
     331        lb.addCommand('options', Lang().label('Back'), OPCode()['BACK']) 
     332        lb.addCommand('back', Lang().label('Back'), OPCode()['BACK']) 
     333        lb.addCommand('select', Lang().label('Play'), OPCode()['PLAY'])           
     334 
     335        self._iActionStack.append(actions) 
     336        self._iViewStack.append(lb.getList()) 
     337        self._iListStack.append(id_list) 
     338         
     339     
     340    def playlists(self): 
     341        print "Audio playlists" 
     342        lb = ListBox(Lang().label('Playlists')) 
     343        actions = [] 
     344        id_list = [] 
     345         
     346        db = AudioQueries() 
     347        resultset = db.playlists() 
     348         
     349        # feed list 
     350        for playlist in resultset.fetchall(): 
     351            lb.addLabel(playlist) 
     352         
     353        # Feed options menu 
     354        lb.addCommand('options', Lang().label('Select'), OPCode()['SELECT']) 
     355        lb.addCommand('options', Lang().label('NowPlaying'), OPCode()['NOWPLAYING']) 
     356        lb.addCommand('options', Lang().label('Back'), OPCode()['BACK']) 
     357        lb.addCommand('back', Lang().label('Back'), OPCode()['BACK']) 
     358        lb.addCommand('select', Lang().label('Select'), OPCode()['SELECT']) 
     359         
     360        self._iActionStack.append(actions) 
     361        self._iViewStack.append(lb.getList()) 
     362        self._iListStack.append(id_list) 
     363     
     364     
     365    def playlistSongs(self): 
     366        print "Audio playlist" 
     367        playlistName="" 
     368        lb = ListBox(playlistName) 
     369        actions = [] 
     370        id_list = [] 
     371         
     372        db = AudioQueries() 
     373        resultset = db.genreSongs( playlistName ) 
     374         
     375        # feed list 
     376        for song in resultset.fetchall(): 
     377            lb.addLabel(song[3]) 
     378             
     379        # Feed options menu 
     380        lb.addCommand('options', Lang().label('Play'), OPCode()['PLAY']) 
     381        lb.addCommand('options', Lang().label('NowPlaying'), OPCode()['NOWPLAYING']) 
     382        lb.addCommand('options', Lang().label('Back'), OPCode()['BACK']) 
     383        lb.addCommand('back', Lang().label('Back'), OPCode()['BACK']) 
     384        lb.addCommand('select', Lang().label('Play'), OPCode()['PLAY'])  
     385         
     386        self._iActionStack.append(actions) 
     387        self._iViewStack.append(lb.getList()) 
     388        self._iListStack.append(id_list) 
     389         
     390         
     391 
     392class ViewEngine( object ): 
     393    def __init__(self): 
     394        self._iViewStack = [] 
     395        self._iActionStack = [] 
     396        self._iListStack = [] 
     397         
     398        self._iAudioView = AudioView(self._iViewStack, self._iActionStack, 
     399                                     self._iListStack) 
     400        self._iVideoView = VideoView(self._iViewStack, self._iActionStack, 
     401                                     self._iListStack) 
     402        self._iDvdView = DvdView() 
     403        self._iTvView = TvView() 
     404         
     405 
     406         
     407     
     408    def select_view(self, aOPCode): 
     409        if aOPCode == OPCode()['HELLO']: 
     410            self._main() 
     411             
     412        elif aOPCode == 1: 
     413            return self._iViewStack[1]['view']() 
     414        elif aOPCode == 2: 
     415            return self._iViewStack[2]['view']() 
     416         
     417        return self._iViewStack[-1] 
     418 
     419 
     420    def _main(self): 
     421        lb = ListBox('myMRC') 
     422        action = [] 
     423        # Feed listbox 
     424        if Settings().get('settings', 'audio') == '1': 
     425            lb.addLabel(Lang().label('Audio')) 
     426            action.append( self._audio ) 
     427        if Settings().get('settings', 'video') == '1': 
     428            lb.addLabel(Lang().label('Video')) 
     429            action.append( self._video ) 
     430        if Settings().get('settings', 'dvd') == '1': 
     431            lb.addLabel(Lang().label('DVD')) 
     432            action.append( self._DVD ) 
     433        if Settings().get('settings', 'tv') == '1': 
     434            lb.addLabel(Lang().label('TV')) 
     435            action.append( self._TV ) 
     436         
     437        # Feed options menu 
     438        lb.addCommand('options', Lang().label('Select'), OPCode()['SELECT']) 
     439        lb.addCommand('options', Lang().label('Disconnect'), OPCode()['DISCONNECT']) 
     440        lb.addCommand('options', Lang().label('Settings'), OPCode()['SETTINGS']) 
     441        lb.addCommand('options', Lang().label('About'), OPCode()['ABOUT']) 
     442        lb.addCommand('options', Lang().label('Exit'), OPCode()['EXIT']) 
     443        lb.addCommand('back', Lang().label('Exit'), OPCode()['EXIT']) 
     444        lb.addCommand('select', Lang().label('Select'), OPCode()['SELECT']) 
     445        self._iViewStack.append(lb.getList()) 
     446        self._iActionStack.append(action) 
     447     
     448    def _audio(self): 
     449        print "audio" 
     450        self._iAudioView.main() 
     451         
     452             
     453    def _video(self): 
     454        self._iVideoView.main() 
     455         
     456         
     457    def _DVD(self): 
     458        print "DVD" 
     459 
     460     
     461    def _TV(self): 
     462        print "TV" 
     463         
     464    def getResultset(self): 
     465        return self._iResultSet 
     466     
     467    def getActions(self): 
     468        return self._iActionStack[-1] 
     469     
     470    def getView(self): 
     471        return self._iViewStack[-1] 
     472     
     473    def getStack(self): 
     474        return self._iListStack[-1] 
     475     
     476    def back(self): 
     477        if len(self._iViewStack)-1 > 0: 
     478            self._iViewStack.pop() 
     479            self._iActionStack.pop() 
     480        print len(self._iViewStack) 
     481        return self._iViewStack[-1] 
     482 
     483class ClientEngine( object ): 
     484    def __init__(self, aSendCb): 
     485        self._iViewEngine = ViewEngine() 
     486        self.send = aSendCb 
     487        DBDriver( '/home/dlefevre/workspace/mymrc/src' ) 
     488        #self.handle_event(PacketBuilder().build('0000', '')) 
     489     
     490    def handle_event(self, aEvent): 
     491        print "Event received: ", aEvent 
     492        opcode, length, value = PacketParser().parse(aEvent) 
     493         
     494        ## UI 
     495        if opcode == OPCode()['HELLO']: 
     496            self._iViewEngine.select_view(opcode) 
     497            retVal = self._iViewEngine.getView() 
     498            self.send(PacketBuilder().build(OPCode()['PARSELS'], retVal)) 
     499        elif opcode == OPCode()['SELECT']: 
     500            actions = self._iViewEngine.getActions() 
     501            actions[int(value)]() 
     502            retVal = self._iViewEngine.getView() 
     503            self.send(PacketBuilder().build(OPCode()['PARSELS'], retVal)) 
     504             
     505        elif opcode == OPCode()['BACK']: 
     506            retVal = self._iViewEngine.back() 
     507            self.send(PacketBuilder().build(OPCode()['PARSELS'], retVal)) 
     508         
     509         
     510        # controller 
     511        elif opcode == OPCode()['PLAY']: 
     512            try: 
     513                print "value: ", value 
     514                id = self._iViewEngine.getStack()[int(value)] 
     515                path = AudioQueries().songById(id) 
     516                print path 
     517                AudioController().play( path[0] ) 
     518            except: 
     519                pass 
     520         
     521         
     522         
     523         
     524if __name__ == '__main__': 
     525    Settings('/home/dlefevre/workspace/mymrc/src') 
     526    Lang('/home/dlefevre/workspace/mymrc/src') 
     527    DBDriver( '/home/dlefevre/workspace/mymrc/src' ) 
     528    #resultset = DBDriver( '/home/dlefevre/workspace/mymrc/src' ).execute(query) 
     529    #print resultset.fetchall() 
     530 
     531 
     532    #query = "INSERT INTO song (artist_id, title, path, album_id, track_no, genre_id)"\ 
     533    #"values (%d, '%s', '%s', %d, %d, %d)" %(1, 
     534    #                                   unicode('Counting Crows - Mr. Jones.mp3'), 
     535    #                                   unicode('/home/storage/Music/Counting Crows - Mr. Jones.mp3'), 
     536    #                                   1, 
     537    #                                   1, 
     538    #                                   1 
     539    #                                   ) 
     540    #query = "INSERT INTO artist (name) values ('%s')" %(unicode('Counting Crows'))   
     541    #query = "INSERT INTO genre (name) values ('%s')" %(unicode('Rock')) 
     542    #print "All songs" 
     543    #print AudioView().allSongs() 
     544    #print "Artists" 
     545    #print AudioView().artists() 
     546    #print "Artist albums" 
     547    #print AudioView().artistAlbums() 
     548    #print "Artist album songs" 
     549    #print AudioView().artistAlbumSongs() 
     550    #print "Artist All songs" 
     551    #print AudioView().artistAllSongs() 
     552    #print "albums" 
     553    #print AudioView().albums() 
     554    #print "Album Songs" 
     555    #print AudioView().albumSongs() 
     556    #print "Genres" 
     557    #print AudioView().genres() 
     558    #print "Genre Songs" 
     559    #print AudioView().genreSongs() 
     560    #print "playlists" 
     561    #print AudioView().playlists() 
     562    #print "Playlist Songs" 
     563    #print AudioView().playlistSongs() 
     564     
     565    query = """ INSERT INTO song (title, path) values ('Gin Blossoms - Allison Road', '/home/storage/Music/Gin Blossoms - Allison Road.mp3')""" 
     566    query = """SELECT * FROM song""" 
     567    rs = DBDriver().execute(query) 
     568    print rs.fetchall() 
     569 
     570     
     571    def send(aData): 
     572        print aData 
     573     
     574    engine = ClientEngine( send ) 
     575         
     576    while True: 
     577        entry = raw_input('>>>').strip() 
     578        if entry == 'hello': 
     579            engine.handle_event(PacketBuilder().build(OPCode()['HELLO'],'')) 
     580        elif entry == 'select': 
     581            entry = raw_input('Index >>>').strip() 
     582            engine.handle_event(PacketBuilder().build(OPCode()['SELECT'], entry) ) 
     583        elif entry == 'back': 
     584            engine.handle_event(OPCode()['BACK']) 
     585        elif entry == 'q': 
     586            break 
     587 
     588    print "Bye bye" 
     589     
     590 
     591     
  • mymrc/trunk/mymrc/src/mymrc.conf

    r8 r14  
    1 [wifi] 
     1[inet] 
    22#interface=eth0 
    3 port=1233 
     3port=1234 
    44host=11.2.1.4 
    55maxclient=5 
     
    1313[database] 
    1414dbname=mymrcdb 
     15path = /home/dlefevre/workspace/mymrc/src 
    1516 
    1617[players] 
     
    2223[settings] 
    2324printdebug = yes 
     25language=en 
     26audio=1 
     27video=1 
     28dvd=0 
     29tv=0 
     30 
     31 
    2432 
    2533# do not modify unless you know what you are doing! 
  • mymrc/trunk/mymrc/src/mymrcd.py

    r8 r14  
    88from networking.inetserver import InetServer 
    99from settings.players import Players 
     10from settings.lang import Lang 
    1011import os 
    1112 
     
    2829        Settings( os.getcwd() ) 
    2930        Players( os.getcwd() ) 
     31        Lang( os.getcwd() ) 
     32         
    3033 
    3134    ## Run the server 
     
    4649    myMRC = MyMRCd() 
    4750    myMRC.run() 
     51    print os.getcwd()  
    4852    APP_LOCK.wait( ) 
  • mymrc/trunk/mymrc/src/networking/inetserver.py

    r8 r14  
    11################################################################################ 
    22#    Networking:  
    3 import thread 
    4 import threading 
     3from settings.settings import Settings 
     4from mobileclient.client import Client 
     5import thread, threading, socket 
    56 
    67def printd( string ): 
    78    print string 
     9 
     10 
     11 
     12# Inet socket server 
     13class InetServerSocket( socket.socket ): 
     14     
     15    ## The constructor. 
     16    #  @param self: The object pointer. 
     17    #  @param aHost: Host name to connect to. 
     18    #  @param aPort: Port on the host to bind. 
     19    #  @param aMaxClient: Maximum number of concurrent connection. 
     20    def __init__( self, aHost, aPort, aMaxClient ): 
     21        socket.socket.__init__( self, socket.AF_INET, socket.SOCK_STREAM ) 
     22        self.bind ( ( str(aHost), int(aPort) ) ) 
     23        self.listen ( int(aMaxClient) ) 
     24        self._iLock = threading.Semaphore() 
     25        self._iClientStack = [] 
     26        self._iMaxClient = int(aMaxClient) 
     27        printd("Inet interface: (%s:%s) - concurrent connection: %s"%(aHost,  
     28                                                                     aPort,  
     29                                                                     aMaxClient)) 
     30 
     31 
     32    ## Add instance to the array. 
     33    #  @param self: The object pointer. 
     34    #  @param aChannel: Channel to had the the array. 
     35    def _addToStack( self, aClient ): 
     36        self._iLock.acquire( ) 
     37        self._iClientStack.append( aClient ) 
     38        self._iLock.release( ) 
     39        printd( "Client added to stack") 
     40         
     41         
     42    ## Remove instance from array 
     43    #  @param self: The object pointer 
     44    #  @param aChannel: Channel to remove from the queue 
     45    def _removeFromStack( self, aClient ): 
     46        self._iLock.acquire( ) 
     47        self._iClientStack.remove( aClient ) 
     48        self._iLock.release( ) 
     49        printd( "Channel removed from stack." ) 
     50                     
     51                     
     52    ## Watch for channel incoming requests. 
     53    #  @param self: The object pointer. 
     54    #  @param aChannel: Channel to remove from the queue. 
     55    def _channelWatcher( self, aChannel ): 
     56        while 1: 
     57            data = aChannel.recv ( self._iBufferSize ) 
     58            if not data: break 
     59            else: 
     60                #retVal = self._mCallback( data ) 
     61                #retVal = EventHandler().event(data) 
     62                #if retVal: aChannel.send ( retVal ) 
     63                pass 
     64                     
     65        self._removeFromStack( aChannel ) 
     66        aChannel.close( ) 
     67        printd("Connection closed: " + str( aChannel ) ) 
     68     
     69     
     70    ## Handle incomming connection request. 
     71    #  @param self: The object pointer. 
     72    def _connectionHandler( self ): 
     73        printd("Wait for incoming connection") 
     74        while True: 
     75            if len(self._iClientStack) in range( self._iMaxClient ): 
     76                #channel, details = self.accept() 
     77                #printd( 'New connection with: ' + str(details) ) 
     78                # new client 
     79                client = Client(self.accept()) 
     80                self._addToStack( client ) 
     81                #self._addToStack( channel ) 
     82                 
     83 
     84                #channel.setblocking( 1 ) 
     85                #thread.start_new_thread( self._channelWatcher, ( channel, ) ) 
     86            else: 
     87                printd("Maximum concurrent connection exceeded. Close client \ 
     88                    connection before creating a new one")         
     89     
     90         
     91    ## Listen interface for incomming connection. 
     92    #  @param self The object pointer. 
     93    def start( self ): 
     94        thread.start_new_thread(self._connectionHandler, () ) 
     95     
     96         
     97    ## Send data 
     98    #  @param self The object pointer. 
     99    #  @param aFrame Frame.     
     100    def send( self, aFrame): 
     101        pass          
     102     
     103    def __del__(self): 
     104        for client in self._iClientStack: 
     105            self._removeFromStack(client) 
     106            del client 
    8107 
    9108## Inet server singletong 
     
    14113    ## Inet server class declaration 
    15114    class InetServerClass: 
    16         ## maximum buffer size 
    17         _iBufferSize = 1024 
    18      
     115   
    19116        ## The constructor. 
    20117        #  @param self: The object pointer. 
    21         #  @param aHost: Host name to connect to. 
    22         #  @param aPort: Port on the host to bind. 
    23         #  @param aMaxClient: Maximum number of concurrent connection. 
    24118        def __init__( self ): 
    25             # class variables 
    26             #self._iHost = aHost 
    27             #self._iPort = int( aPort ) 
    28             #self._iMaxClient = int( aMaxClient ) 
    29              
    30             self._iHost = str('11.2.1.4') 
    31             self._iPort = int(1233) 
    32             self._iMaxClient = int(5) 
    33             self._iSem = threading.Semaphore() 
    34             self._iChannelStack = [] 
    35              
    36             # Create socket connection 
    37             import socket 
    38             self._iSocket = socket.socket ( socket.AF_INET, socket.SOCK_STREAM ) 
    39             printd("Wifi driver loaded")         
     119            self._iSocketServer = None 
    40120     
    41121        ## Start the server. 
    42122        #  @param self The object pointer. 
    43123        def start(self): 
    44             self._connect() 
     124            self._iSocketServer = InetServerSocket( 
     125                                            Settings().get("inet","host"), 
     126                                            Settings().get("inet","port"), 
     127                                            Settings().get("inet","maxclient")) 
     128            self._iSocketServer.start() 
    45129            printd("InetServer started") 
    46130         
     
    48132        #  @param self The object pointer. 
    49133        def stop(self): 
    50             self._iRunning = False 
    51             printd("InetServer stopped") 
     134            if self._iSocketServer: 
     135                del self._iSocketServer 
     136                self._iSocketServer = None 
     137                printd("InetServer stopped") 
    52138         
    53139        ## Restart server. 
     
    57143            self.stop() 
    58144            self.start() 
    59          
    60         def isRunning(self): 
    61             return self._iRunning         
    62              
    63         ## Bind a host at a given port. 
    64         #  @param self: The object pointer. 
    65         def _connect( self ): 
    66             print ( self._iHost, self._iPort ) 
    67             self._iSocket.bind ( ( self._iHost, self._iPort ) ) 
    68             self._iSocket.listen ( self._iMaxClient ) 
    69              
    70          
    71         ## Add instance to the array. 
    72         #  @param self: The object pointer. 
    73         #  @param aChannel: Channel to had the the array. 
    74         def _addToStack( self, aChannel ): 
    75             self._iSem.acquire( ) 
    76             self._iChannelStack.append( aChannel ) 
    77             self._iSem.release( ) 
    78             printd( "Channel added to stack") 
    79          
    80          
    81         ## Remove instance from array 
    82         #  @param self: The object pointer 
    83         #  @param aChannel: Channel to remove from the queue 
    84         def _removeFromStack( self, aChannel ): 
    85             self._iSem.acquire( ) 
    86             self._iChannelStack.remove( aChannel ) 
    87             self._iSem.release( ) 
    88             printd( "Channel removed from stack." ) 
    89                      
    90                      
    91         ## Watch for channel incoming requests. 
    92         #  @param self: The object pointer. 
    93         #  @param aChannel: Channel to remove from the queue. 
    94         def _channelWatcher( self, aChannel ): 
    95             while 1: 
    96                 data = aChannel.recv ( self._iBufferSize ) 
    97                 if not data: break 
    98                 else: 
    99                     #retVal = self._mCallback( data ) 
    100                     #retVal = EventHandler().event(data) 
    101                     #if retVal: aChannel.send ( retVal ) 
    102                     pass 
    103                      
    104             self._removeFromStack( aChannel ) 
    105             aChannel.close( ) 
    106             printd("Connection closed: " + str( aChannel ) ) 
    107      
    108      
    109         ## Handle incomming connection request. 
    110         #  @param self: The object pointer. 
    111         def _incomingConnectionHandler( self ): 
    112             printd("Wait for incoming connection") 
    113             while True: 
    114                 if len(self._iChannelStack) in range( self._iMaxClient ): 
    115                     channel, details = self._iSocket.accept() 
    116                     printd( 'New connection with: ' + str(details) ) 
    117                     self._addToStack( channel ) 
    118                     channel.setblocking( 1 ) 
    119                     thread.start_new_thread( self._channelWatcher, ( channel, ) ) 
    120                 else: 
    121                     printd("Maximum concurrent connection exceeded. Close client \ 
    122                     connection before creating a new one")         
    123      
    124          
    125         ## Listen interface for incomming connection. 
    126         #  @param self: The object pointer. 
    127         def listen( self, aCallback=lambda:None ): 
    128             self._mCallback = aCallback 
    129             thread.start_new_thread(self._incomingConnectionHandler, () ) 
    130      
    131          
    132         def send( self, aData): 
    133             pass                 
    134          
    135          
     145            
     146        
    136147        ## The destructor 
    137148        # @param self: The object pointer 
    138149        def __del__( self ): 
    139             try: 
    140                 self._iSocket.close()   
    141             except: 
    142                 pass 
     150            self.stop() 
    143151 
    144152    ########################################################################### 
  • mymrc/trunk/mymrc/src/networking/packet.py

    r8 r14  
    4747        packet = "" 
    4848        packet += str( aOpCode ) 
    49         packet += self._formatedLength( aData ) 
     49        packet += self._formatedLength( str(aData) ) 
    5050        packet += str( aData ) 
    5151        return packet