kpod-devel Mailing List for kpod
Status: Beta
Brought to you by:
fry26
You can subscribe to this list here.
2004 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(1) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2005 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(16) |
Dec
(21) |
2006 |
Jan
(10) |
Feb
(77) |
Mar
(91) |
Apr
(55) |
May
(59) |
Jun
(61) |
Jul
(63) |
Aug
(18) |
Sep
|
Oct
(3) |
Nov
(3) |
Dec
|
2007 |
Jan
|
Feb
(10) |
Mar
(4) |
Apr
(7) |
May
(4) |
Jun
(18) |
Jul
(9) |
Aug
(5) |
Sep
(10) |
Oct
(50) |
Nov
(62) |
Dec
(102) |
2008 |
Jan
(18) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Michael S. <fr...@us...> - 2008-01-28 16:51:49
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv17581/src Modified Files: playlistitem.h track.h itunesdb_spl.cpp itunesdbwriter.cpp playlist.h playlist.cpp itunesdb.cpp track.cpp listitem.h utils.h itunesdb_rw.cpp Log Message: various fixes Index: itunesdb_rw.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdb_rw.cpp,v retrieving revision 1.39 retrieving revision 1.40 diff -C2 -d -r1.39 -r1.40 *** itunesdb_rw.cpp 19 Jan 2008 19:54:35 -0000 1.39 --- itunesdb_rw.cpp 28 Jan 2008 16:51:45 -0000 1.40 *************** *** 157,162 **** virtual void handlePlaylist( Playlist * playlist ) { std::auto_ptr<Playlist> plCleanup( playlist ); ! #define ANALYSE_PLAYLIST_STRUCTURE ! #ifdef ANALYSE_PLAYLIST_STRUCTURE printf( "listener handling playlist %s in section %d with %d elements\n", playlist->getTitle().ascii(), --- 157,161 ---- virtual void handlePlaylist( Playlist * playlist ) { std::auto_ptr<Playlist> plCleanup( playlist ); ! #ifdef DEBUG_PLAYLISTS printf( "listener handling playlist %s in section %d with %d elements\n", playlist->getTitle().ascii(), *************** *** 211,219 **** if ( m_currentDataSet != 2 || playlist->containsItemProperty( MHOD_PLAYLIST ) ) { m_itunesdb.m_hasPodcastsFlag |= playlist->getNumTracks() && playlist->isPodcastList(); // can't handle podcasts at the moment ! #ifndef ANALYSE_PLAYLIST_STRUCTURE return; #endif --- 210,220 ---- if ( m_currentDataSet != 2 || playlist->containsItemProperty( MHOD_PLAYLIST ) ) { + // TODO remove podcast flag and create someting holding podcasts groupin information + m_itunesdb.m_hasPodcastsFlag |= playlist->getNumTracks() && playlist->isPodcastList(); // can't handle podcasts at the moment ! #ifndef DEBUG_PLAYLISTS return; #endif Index: utils.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/utils.h,v retrieving revision 1.58 retrieving revision 1.59 diff -C2 -d -r1.58 -r1.59 *** utils.h 23 Jan 2008 23:48:26 -0000 1.58 --- utils.h 28 Jan 2008 16:51:45 -0000 1.59 *************** *** 124,128 **** bool isValid( const Iter& i ) const { return pred( deref( i ) ); } ! unsigned int remaining( const Iter& next, const Iter& end ) { Iter i = next; unsigned int result = 0; --- 124,128 ---- bool isValid( const Iter& i ) const { return pred( deref( i ) ); } ! unsigned int remaining( const Iter& next, const Iter& end ) const { Iter i = next; unsigned int result = 0; *************** *** 149,153 **** bool isValid( const Iter& ) const { return true; } ! unsigned int remaining( const Iter& next, const Iter& end ) { return end - next; } --- 149,153 ---- bool isValid( const Iter& ) const { return true; } ! unsigned int remaining( const Iter& next, const Iter& end ) const { return end - next; } *************** *** 558,561 **** --- 558,562 ---- /** * Removes the element returned by the last next() call from the container and positions the iterator at the next element. + * @pre next() has been called before * @return true if the Iterator is valid and non empty, false otherwise */ *************** *** 575,580 **** /** ! * Removes the elements from after the current position until the end that are part of this RangeIterator. * For filtered iterators only those elements matching the filter get removed. * @return true if at least one element got removed */ --- 576,582 ---- /** ! * Removes all elements after the one returned by the last next() call until the end that are part of this RangeIterator. * For filtered iterators only those elements matching the filter get removed. + * @pre next() has been called before * @return true if at least one element got removed */ Index: playlist.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlist.cpp,v retrieving revision 1.71 retrieving revision 1.72 diff -C2 -d -r1.71 -r1.72 *** playlist.cpp 23 Jan 2008 23:48:26 -0000 1.71 --- playlist.cpp 28 Jan 2008 16:51:45 -0000 1.72 *************** *** 152,163 **** ! bool Playlist::contains( Q_UINT32 trackID ) const { ConstIterator trackiter = getElements(); while( trackiter.hasNext() ) { if( trackiter.next()->getID() == trackID ) { ! return true; } } ! return false; } --- 152,163 ---- ! PlaylistItem * Playlist::findFirst( Q_UINT32 trackID ) const { ConstIterator trackiter = getElements(); while( trackiter.hasNext() ) { if( trackiter.next()->getID() == trackID ) { ! return trackiter.current(); } } ! return NULL; } *************** *** 250,256 **** ! Q_UINT32 Playlist::getTrackIDAt( uint pos ) { ! PlaylistItem* item; ! if( pos < m_tracklist.count() && ( item = m_tracklist[ pos ] ) ) { return item->getID(); } else { --- 250,256 ---- ! Q_UINT32 Playlist::getTrackIDAt( uint pos ) const { ! PlaylistItem * item = getPlaylistItemAt( pos ); ! if( item ) { return item->getID(); } else { *************** *** 260,263 **** --- 260,272 ---- + PlaylistItem * Playlist::getPlaylistItemAt( uint pos ) const { + if ( pos < m_tracklist.count() ) { + return m_tracklist[ pos ]; + } else { + return NULL; + } + } + + // FIXME container might get changed here - we need to handle the "dirty" flag Playlist::Iterator Playlist::getElements() { *************** *** 527,532 **** QByteArray buffer; - m_tracklist.sort(); - writeData(buffer, isMainlist); outstream.writeRawBytes( buffer.data(), buffer.size()); --- 536,539 ---- Index: listitem.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/listitem.h,v retrieving revision 1.28 retrieving revision 1.29 diff -C2 -d -r1.28 -r1.29 *** listitem.h 19 Jan 2008 19:54:35 -0000 1.28 --- listitem.h 28 Jan 2008 16:51:45 -0000 1.29 *************** *** 60,63 **** --- 60,64 ---- MHOD_ARTIST_FOR_SORT = 23, MHOD_KEYWORDS = 24, + // TODO what about field type 25 and 26? MHOD_TITLE_FOR_SORT = 27, MHOD_ALBUM_FOR_SORT = 28, *************** *** 94,98 **** friend class ItunesDBParser; ! public: --- 95,100 ---- friend class ItunesDBParser; ! // TODO implement generic header access by dumping the whole data into memory and ! // provide access functions public: Index: itunesdb.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdb.cpp,v retrieving revision 1.117 retrieving revision 1.118 diff -C2 -d -r1.117 -r1.118 *** itunesdb.cpp 24 Jan 2008 00:26:08 -0000 1.117 --- itunesdb.cpp 28 Jan 2008 16:51:45 -0000 1.118 *************** *** 284,288 **** } } - sort(); } --- 284,287 ---- Index: playlistitem.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlistitem.h,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** playlistitem.h 23 Jan 2008 23:48:26 -0000 1.18 --- playlistitem.h 28 Jan 2008 16:51:45 -0000 1.19 *************** *** 73,76 **** --- 73,78 ---- Q_UINT32 getGroupID() const { return m_groupid; } + void setGroupID( Q_UINT32 groupid ) { m_groupid = groupid; } + Q_UINT32 getGroupRef() const { return m_groupref; } Index: track.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/track.cpp,v retrieving revision 1.76 retrieving revision 1.77 diff -C2 -d -r1.76 -r1.77 *** track.cpp 19 Jan 2008 19:54:35 -0000 1.76 --- track.cpp 28 Jan 2008 16:51:45 -0000 1.77 *************** *** 519,522 **** --- 519,523 ---- date_added( 0 ), date_released( 0 ), + mFileFormatField( 0x4d503320 ), rating ( 0 ), vbr( 0 ), *************** *** 563,566 **** --- 564,568 ---- m_recentlyPlayed( false ) { + // TODO create a setter for setting this and the mFileFormatField setFileFormatDesc( QString( "MPEG audio file" ) ); // hardwired for now } *************** *** 589,593 **** stream << (Q_UINT32) getID(); // 0x10 stream << (Q_UINT32) 1; // 0x14 ! stream << (Q_UINT32) 0x4d503320; // 0x18 ipod shuffle wants a "MP3 " here stream << vbr; // 0x1C stream << type; // 0x1D --- 591,595 ---- stream << (Q_UINT32) getID(); // 0x10 stream << (Q_UINT32) 1; // 0x14 ! stream << (Q_UINT32) mFileFormatField; // 0x18 ipod shuffle wants a "MP3 " here stream << vbr; // 0x1C stream << type; // 0x1D *************** *** 697,701 **** instream >> dummy; // 20 ! instream >> dummy; // 24 instream >> vbr; // 28 instream >> type; // 29 --- 699,703 ---- instream >> dummy; // 20 ! instream >> mFileFormatField; // 24 instream >> vbr; // 28 instream >> type; // 29 Index: playlist.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlist.h,v retrieving revision 1.53 retrieving revision 1.54 diff -C2 -d -r1.53 -r1.54 *** playlist.h 23 Jan 2008 23:48:26 -0000 1.53 --- playlist.h 28 Jan 2008 16:51:45 -0000 1.54 *************** *** 115,123 **** Sortorder getSortOrder() const; - /** * Returns true if the playlist contains the specified trackid. */ ! bool contains( Q_UINT32 trackID ) const; /** --- 115,128 ---- Sortorder getSortOrder() const; /** * Returns true if the playlist contains the specified trackid. + * @deprecated use findFirst() instead. To be removed in the 0.6 release */ ! bool contains( Q_UINT32 trackID ) const __attribute__((deprecated)) { ! return findFirst( trackID ); ! } ! ! // TODO write doc ! PlaylistItem * findFirst( Q_UINT32 trackID ) const; /** *************** *** 163,167 **** * or above the last element in the list. */ ! virtual Q_UINT32 getTrackIDAt( uint pos ); /** --- 168,178 ---- * or above the last element in the list. */ ! Q_UINT32 getTrackIDAt( uint pos ) const; ! ! /** ! * Returns the playlist item at the given position or NULL if the given position ! * is either negative or exceeds list lengt. ! */ ! PlaylistItem * getPlaylistItemAt( uint pos ) const; /** *************** *** 175,185 **** /** - * @deprecated as the Iterator iterates over elements of type @c PlaylistItem the name is somewhat misleading. Use the new Method getElements() instead. - */ - Iterator getTrackIDs() __attribute__((deprecated)) { - return getElements(); - } - - /** * The const version of the above method. * Returns an iterator over all tracks in this playlist. --- 186,189 ---- *************** *** 189,199 **** /** - * @deprecated as the Iterator iterates over elements of type @c PlaylistItem the name is somewhat misleading. Use the new Method getElements() instead. - */ - ConstIterator getTrackIDs() const __attribute__((deprecated)) { - return getElements(); - } - - /** * Returns the number of tracks in this playlist * @return the number of tracks in this playlist --- 193,196 ---- Index: itunesdb_spl.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdb_spl.cpp,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** itunesdb_spl.cpp 8 Nov 2007 09:40:42 -0000 1.12 --- itunesdb_spl.cpp 28 Jan 2008 16:51:45 -0000 1.13 *************** *** 874,878 **** virtual bool operator() ( const Track * track ) const { ! return track && ( mNegate ^ mPlaylist->contains( track->getID() ) ); } --- 874,878 ---- virtual bool operator() ( const Track * track ) const { ! return track && ( mNegate ^ !!mPlaylist->findFirst( track->getID() ) ); } *************** *** 1150,1153 **** --- 1150,1178 ---- mPlaylist.addAll( tracks.iterator() ); } + #ifdef DEBUG_PLAYLISTS + TrackPtrList::Iterator trackIter = tracks.iterator(); + Playlist::Iterator plIter = mPlaylist.getElements(); + if ( plIter.remaining() != trackIter.remaining() ) { + printf( "ATTENTION: plIter.remaining()[ %d ] != trackIter.remaining()[ %d ]\n", + plIter.remaining(), trackIter.remaining() ); + } + while ( trackIter.hasNext() ) { + Track * track = trackIter.next(); + PlaylistItem * plItem = mPlaylist.findFirst( track->getID() ); + if ( !plItem ) { + printf( "ATTENTION: track doesn't exist\n" ); + continue; + } + if ( track->getID() != plItem->getID() ) { + printf( "ATTENTION: trackID is different\n" ); + } + if ( track->getDBID() != plItem->getTrackDBID() ) { + printf( "ATTENTION: trackDBid is different\n" ); + } + if ( track->getDateAdded() != plItem->getTrackDateAdded() ) { + printf( "ATTENTION: track dateadded property is different\n" ); + } + } + #endif } Index: track.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/track.h,v retrieving revision 1.78 retrieving revision 1.79 diff -C2 -d -r1.78 -r1.79 *** track.h 18 Jan 2008 22:23:15 -0000 1.78 --- track.h 28 Jan 2008 16:51:45 -0000 1.79 *************** *** 648,651 **** --- 648,652 ---- // attributes + // TODO implement the header fields by accessing a memory image of a MHIT Q_UINT32 lastmodified; // last modified date Q_UINT32 file_size; *************** *** 669,672 **** --- 670,675 ---- Q_UINT32 mSoundCheck; + Q_UINT32 mFileFormatField; + unsigned char rating; // rating 0 lowest 100 highest unsigned char vbr; // vbr=1, cbr=0 Index: itunesdbwriter.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbwriter.cpp,v retrieving revision 1.35 retrieving revision 1.36 diff -C2 -d -r1.35 -r1.36 *** itunesdbwriter.cpp 23 Jan 2008 23:48:26 -0000 1.35 --- itunesdbwriter.cpp 28 Jan 2008 16:51:45 -0000 1.36 *************** *** 287,290 **** --- 287,293 ---- uint * m_indices; bool m_writeMHOD53; + + Q_UINT32 m_groupid; + public: MasterPlaylist( itunesdb::TrackPtrList & allTracks, bool writeMHOD53 ) *************** *** 293,297 **** m_trackCount( allTracks.count() ), m_indices( new uint [ m_trackCount ] ), ! m_writeMHOD53( writeMHOD53 ) { TrackPtrList::Iterator trackIter = m_trackPtrList.iterator(); --- 296,301 ---- m_trackCount( allTracks.count() ), m_indices( new uint [ m_trackCount ] ), ! m_writeMHOD53( writeMHOD53 ), ! m_groupid( 0 ) { TrackPtrList::Iterator trackIter = m_trackPtrList.iterator(); *************** *** 299,305 **** --- 303,315 ---- Track * current = trackIter.next(); addPlaylistItem( current->getID(), current->getDateAdded(), current->getDBID() ); + // calculate max track id here + if ( m_groupid < current->getID() ) { + m_groupid = current->getID(); + } } + m_groupid += 4; for ( uint i = 0; i < m_trackCount; ++i ) { m_indices[ i ] = i; + getPlaylistItemAt( i )->setGroupID( m_groupid++ ); } } *************** *** 308,311 **** --- 318,325 ---- } + Q_UINT32 getNextGroupID() { + return m_groupid; + } + struct IndexComparator { TrackComparatorPtr m_comparator; *************** *** 514,517 **** --- 528,532 ---- }; + /*! \fn itunesdb::ItunesDBWriter::fillPlaylistBuffer( QByteArray& buffer) *************** *** 527,530 **** --- 542,557 ---- masterlist.setTitle( m_datasource.getTitle() ); + // update group ids + Q_UINT32 groupid = masterlist.getNextGroupID(); + for( Playlist * playlist= m_datasource.firstPlaylist(); playlist != NULL; playlist= m_datasource.nextPlaylist()) { + playlist->sort(); + Playlist::Iterator iter = playlist->getElements(); + while( iter.hasNext() ) { + PlaylistItem * plItem = iter.next(); + plItem->setGroupID( groupid++ ); + } + } + + // write mhsd stream << (Q_UINT32) 0x6473686D; // "mhsd" *************** *** 539,544 **** stream << (Q_UINT32) 0x5C; // headerlen stream << (Q_UINT32) m_datasource.getNumPlaylists()+ 1; // number of playlists incl. mainlist ! for( int i= 0; i< 20; i++) stream << (Q_UINT32) 0; // pad the rest (80 bytes) // write the mainlist --- 566,572 ---- stream << (Q_UINT32) 0x5C; // headerlen stream << (Q_UINT32) m_datasource.getNumPlaylists()+ 1; // number of playlists incl. mainlist ! for( int i= 0; i < 20; i++ ) { stream << (Q_UINT32) 0; // pad the rest (80 bytes) + } // write the mainlist |
From: Michael S. <fr...@us...> - 2008-01-24 00:26:09
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv26661/src Modified Files: itunesdb.cpp Log Message: initializing value Index: itunesdb.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdb.cpp,v retrieving revision 1.116 retrieving revision 1.117 diff -C2 -d -r1.116 -r1.117 *** itunesdb.cpp 23 Jan 2008 23:48:26 -0000 1.116 --- itunesdb.cpp 24 Jan 2008 00:26:08 -0000 1.117 *************** *** 418,421 **** --- 418,422 ---- ITunesDB::ITunesDB( IPodSysInfo& ipodSysInfo ) : + mDoDirtyFlagHandling( true ), mInternalVersion( 0 ), m_playlists( new PlaylistContainer() ), |
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv11899/src Modified Files: playlistitem.h playlistitem.cpp itunesdb.h itunesdbwriter.cpp playlist.h playlist.cpp itunesdb.cpp utils.h Log Message: current development Index: utils.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/utils.h,v retrieving revision 1.57 retrieving revision 1.58 diff -C2 -d -r1.57 -r1.58 *** utils.h 19 Jan 2008 19:54:35 -0000 1.57 --- utils.h 23 Jan 2008 23:48:26 -0000 1.58 *************** *** 181,184 **** --- 181,194 ---- } * </code></pre> + * You can also use a more standard C++ iterator logic with operator ++() and operator *() in + * a for loop like this: + * <pre><code> + itunesdb::TrackPtrList::Iterator trackIter = tlist.iterator(); + for ( ; !trackIter.atEnd(); ++trackIter ) { + itunesdb::Track * track = *trackIter; + ... some code ... + } + * </code></pre> + * but DO NOT mix both ways. * The TUnaryPredicate decides if an element is part of the range and therefore should be taken into account by hasNext() * and next() or not. *************** *** 190,195 **** template <typename IterType, typename Iter, typename TUnaryPredicate = TRUEPredicate, typename TDereferenceFun = DefaultDeref< IterType, Iter > > class RangeIterator { ! Iter m_current; // points to the element returned by next ! Iter m_next; // points to the element to be returned by next() Iter m_end; // one beyond the last to return --- 200,205 ---- template <typename IterType, typename Iter, typename TUnaryPredicate = TRUEPredicate, typename TDereferenceFun = DefaultDeref< IterType, Iter > > class RangeIterator { ! Iter m_lastreturned; // points to the element returned by the last next() ! Iter m_pos; // points to the element to be returned by next() Iter m_end; // one beyond the last to return *************** *** 211,219 **** void setRange( Iter pos, Iter end ) { m_end = end; ! m_current = pos; ! if ( m_current != m_end && !m_helper.isValid( m_current ) ) { ! m_current = m_helper.successor( m_current, m_end ); } ! m_next = m_current; } --- 221,230 ---- void setRange( Iter pos, Iter end ) { m_end = end; ! m_pos = pos; ! if ( m_pos != m_end && !m_helper.isValid( m_pos ) ) { ! // set m_current to the first valid position ! m_pos = m_helper.successor( m_pos, m_end ); } ! m_lastreturned = m_pos; } *************** *** 223,227 **** */ Iter currentPos() { ! return m_current; } --- 234,238 ---- */ Iter currentPos() { ! return m_lastreturned; } *************** *** 231,235 **** */ bool empty() const { ! return m_current == m_end; } --- 242,246 ---- */ bool empty() const { ! return m_lastreturned == m_end; } *************** *** 247,254 **** /** * @brief Returns true if there are elements left so calling next() would return the next element rather than causing a segfault * @return true if there are elements left */ bool hasNext() const { ! return m_next != m_end; } --- 258,290 ---- /** * @brief Returns true if there are elements left so calling next() would return the next element rather than causing a segfault + * <pre><code> + itunesdb::TrackPtrList::Iterator trackIter = tlist.iterator(); + while( trackIter.hasNext() ) { + itunesdb::Track * track = trackIter.next(); + ... some code ... + } + * </code></pre> * @return true if there are elements left */ bool hasNext() const { ! return m_pos != m_end; ! } ! ! /** ! * @brief Returns true if the iterator points to the end. ! * ! * Call this method together with operator *() and operator ++() and check, ! * if it's safe to dereference the current element like this ! * <pre><code> ! itunesdb::TrackPtrList::Iterator trackIter = tlist.iterator(); ! for ( ; !trackIter.atEnd(); ++trackIter ) { ! itunesdb::Track * track = *trackIter; ! ... some code ... ! } ! * </code></pre> ! * @return true if there are no elements left ! */ ! bool atEnd() const { ! return m_pos == m_end; } *************** *** 266,273 **** */ IterType next() { ! m_current = m_next; ! m_next = m_helper.successor( m_current, m_end ); return current(); } /** --- 302,338 ---- */ IterType next() { ! ++(*this); return current(); } + + /** + * @brief Increments this iterator. + * + * This method is here for convenience. It's purpose is to implement standard + * C++ iterator behaviour and to be used in conjuction with the derefenence + * operator *(). Don not ever mix this with calls to hasNext()/next() unless you know + * what you're doing here. + * @return a reference to this iterator + */ + RangeIterator& operator++ () { + m_lastreturned = m_pos; + m_pos = m_helper.successor( m_pos, m_end ); + return *this; + } + + /** + * @brief Increments this iterator. + * + * This method is here for convenience. It's purpose is to implement standard + * C++ iterator behaviour and to be used in conjuction with the derefenence + * operator *(). Don not ever mix this with calls to hasNext()/next() unless you know + * what you're doing here. + * @return an iterator positioned to the element before the increment. + */ + RangeIterator operator++ (int) { + RangeIterator temp( *this ); + ++(*this); + return temp; + } /** *************** *** 276,280 **** */ IterType current() const { ! return m_dereferenceFun( m_current ); } --- 341,353 ---- */ IterType current() const { ! return m_dereferenceFun( m_lastreturned ); ! } ! ! /** ! * @brief Returns the element the iterator is positioned to ! * @return the element the iterator is positioned to ! */ ! IterType operator *() const { ! return m_dereferenceFun( m_pos ); } *************** *** 282,286 **** * @brief Returns the number of elements remaining in this iterator. * ! * ... meaning the number of times the next() method can be called before the hasNext() method willreturn false. * For filtered iterators this may be a lengthy operation since the iterator needs to apply its filter over all * elements to determine how many elements are left. --- 355,359 ---- * @brief Returns the number of elements remaining in this iterator. * ! * ... meaning the number of times the next() method can be called before the hasNext() method will return false. * For filtered iterators this may be a lengthy operation since the iterator needs to apply its filter over all * elements to determine how many elements are left. *************** *** 288,292 **** */ unsigned int remaining() const { ! return m_helper.remaining( m_next, m_end ); } --- 361,365 ---- */ unsigned int remaining() const { ! return m_helper.remaining( m_pos, m_end ); } *************** *** 300,304 **** IterType last() const { Iter result = m_end; ! while( result != m_current && !m_helper.isValid( --result ) ); return m_dereferenceFun( result ); } --- 373,377 ---- IterType last() const { Iter result = m_end; ! while( result != m_lastreturned && !m_helper.isValid( --result ) ); return m_dereferenceFun( result ); } *************** *** 447,450 **** --- 520,530 ---- return isValid() && BaseRangeIterator::hasNext(); } + + /** + * @overload RangeIterator::hasNext() + */ + bool atEnd() const { + return !isValid() || BaseRangeIterator::atEnd(); + } }; *************** *** 495,510 **** /** ! * Removes the elements from the current position until the end that are part of this RangeIterator. * For filtered iterators only those elements matching the filter get removed. * @return true if at least one element got removed */ bool removeRemaining() { ! if ( !IteratorBase::hasNext() ) { return false; } do { - IteratorBase::next(); remove(); } while ( IteratorBase::hasNext() ); return true; } --- 575,591 ---- /** ! * Removes the elements from after the current position until the end that are part of this RangeIterator. * For filtered iterators only those elements matching the filter get removed. * @return true if at least one element got removed */ bool removeRemaining() { ! if ( IteratorBase::atEnd() ) { return false; } + IteratorBase::operator++(); do { remove(); } while ( IteratorBase::hasNext() ); + return true; } *************** *** 780,784 **** */ void clear() { ! #if 0 // FIXME remove iterator testcode before release iterator().removeRemaining(); --- 861,866 ---- */ void clear() { ! #define TEST_ITERATOR_CLEAR ! #ifdef TEST_ITERATOR_CLEAR // FIXME remove iterator testcode before release iterator().removeRemaining(); Index: playlist.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlist.cpp,v retrieving revision 1.70 retrieving revision 1.71 diff -C2 -d -r1.70 -r1.71 *** playlist.cpp 19 Jan 2008 19:54:35 -0000 1.70 --- playlist.cpp 23 Jan 2008 23:48:26 -0000 1.71 *************** *** 163,174 **** ! PlaylistItem * Playlist::createNewItem( Q_UINT32 itemid ) { ! return new PlaylistItem( itemid ); } ! int Playlist::addPlaylistItem( Q_UINT32 trackid, int position ) { PlaylistItem * item = createNewItem( trackid ); if ( position > 0 && (uint)position < m_tracklist.count() ) { item->setPosition( position ); --- 163,177 ---- ! PlaylistItem * Playlist::createNewItem( Q_UINT32 itemid, Q_UINT32 track_dateadded, Q_UINT64 trackDBid ) { ! return new PlaylistItem( itemid, track_dateadded, trackDBid ); } ! int Playlist::addPlaylistItem( Q_UINT32 trackid, Q_UINT32 track_dateadded, Q_UINT64 trackDBid, int position ) { PlaylistItem * item = createNewItem( trackid ); + item->m_trackdateadded = track_dateadded; + item->m_trackdbid = trackDBid; + if ( position > 0 && (uint)position < m_tracklist.count() ) { item->setPosition( position ); Index: playlistitem.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlistitem.cpp,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** playlistitem.cpp 19 Jan 2008 19:54:35 -0000 1.11 --- playlistitem.cpp 23 Jan 2008 23:48:26 -0000 1.12 *************** *** 29,32 **** --- 29,39 ---- namespace itunesdb { + PlaylistItem::PlaylistItem() + : ListItem( ITEMTYPE_PLAYLISTITEM ), m_podcastgroupflag( 0 ), m_unk4unk5( 0 ), m_groupid( 0 ), + m_trackid( PLAYLISTITEM_INVALID ), m_trackdateadded( 0 ), m_groupref( 0 ), m_trackdbid( 0 ), + m_pos( PLAYLISTITEM_INVALID ) + { + } + PlaylistItem::PlaylistItem( Q_UINT32 track_id ) : ListItem( ITEMTYPE_PLAYLISTITEM ), m_podcastgroupflag( 0 ), m_unk4unk5( 0 ), m_groupid( 0 ), *************** *** 36,46 **** } ! PlaylistItem::PlaylistItem() : ListItem( ITEMTYPE_PLAYLISTITEM ), m_podcastgroupflag( 0 ), m_unk4unk5( 0 ), m_groupid( 0 ), ! m_trackid( PLAYLISTITEM_INVALID ), m_trackdateadded( 0 ), m_groupref( 0 ), m_trackdbid( 0 ), m_pos( PLAYLISTITEM_INVALID ) { } PlaylistItem::~PlaylistItem() { } --- 43,54 ---- } ! PlaylistItem::PlaylistItem( Q_UINT32 track_id, Q_UINT32 track_dateadded, Q_UINT64 track_dbid ) : ListItem( ITEMTYPE_PLAYLISTITEM ), m_podcastgroupflag( 0 ), m_unk4unk5( 0 ), m_groupid( 0 ), ! m_trackid( track_id ), m_trackdateadded( track_dateadded ), m_groupref( 0 ), m_trackdbid( track_dbid ), m_pos( PLAYLISTITEM_INVALID ) { } + PlaylistItem::~PlaylistItem() { } *************** *** 123,127 **** stream << (Q_UINT32) m_groupid; stream << (Q_UINT32) m_trackid; ! stream << (Q_UINT32) m_trackdateadded; stream << (Q_UINT32) m_groupref; stream << (Q_UINT64) 0; --- 131,135 ---- stream << (Q_UINT32) m_groupid; stream << (Q_UINT32) m_trackid; ! stream << (Q_UINT32) ( m_trackdateadded ? m_trackdateadded + MAC_EPOCH_DELTA : 0 ); stream << (Q_UINT32) m_groupref; stream << (Q_UINT64) 0; Index: itunesdb.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdb.cpp,v retrieving revision 1.115 retrieving revision 1.116 diff -C2 -d -r1.115 -r1.116 *** itunesdb.cpp 21 Jan 2008 21:53:11 -0000 1.115 --- itunesdb.cpp 23 Jan 2008 23:48:26 -0000 1.116 *************** *** 135,141 **** ! PlaylistItem * ITunesDBPlaylist::createNewItem( Q_UINT32 itemid ) { int trackpos = m_itunesdb.getMHITTrackPosFor( itemid ); ! ITunesDBPlaylist::Entry * result = new ITunesDBPlaylist::Entry( itemid, trackpos ); if ( itemid > 0 && trackpos >= 0 ) { result->setTrackDetails( trackpos, m_itunesdb.getTrackAt( trackpos ) ); --- 135,141 ---- ! PlaylistItem * ITunesDBPlaylist::createNewItem( Q_UINT32 itemid, Q_UINT32 track_dateadded, Q_UINT64 trackDBid ) { int trackpos = m_itunesdb.getMHITTrackPosFor( itemid ); ! ITunesDBPlaylist::Entry * result = new ITunesDBPlaylist::Entry( itemid, track_dateadded, trackDBid, trackpos ); if ( itemid > 0 && trackpos >= 0 ) { result->setTrackDetails( trackpos, m_itunesdb.getTrackAt( trackpos ) ); *************** *** 236,241 **** ! ITunesDBPlaylist::Entry::Entry( Q_UINT32 id, uint trackpos ) ! : itunesdb::PlaylistItem( id ), m_mhitTrackPos( trackpos ) { } --- 236,241 ---- ! ITunesDBPlaylist::Entry::Entry( Q_UINT32 id, Q_UINT32 track_dateadded, Q_UINT64 track_dbid, uint trackpos ) ! : itunesdb::PlaylistItem( id, track_dateadded, track_dbid ), m_mhitTrackPos( trackpos ) { } Index: playlistitem.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlistitem.h,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** playlistitem.h 19 Jan 2008 19:54:35 -0000 1.17 --- playlistitem.h 23 Jan 2008 23:48:26 -0000 1.18 *************** *** 82,85 **** --- 82,86 ---- PlaylistItem(); PlaylistItem( Q_UINT32 track_id ); + PlaylistItem( Q_UINT32 track_id, Q_UINT32 track_dateadded, Q_UINT64 track_dbid ); /** Index: playlist.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlist.h,v retrieving revision 1.52 retrieving revision 1.53 diff -C2 -d -r1.52 -r1.53 *** playlist.h 18 Jan 2008 22:23:15 -0000 1.52 --- playlist.h 23 Jan 2008 23:48:26 -0000 1.53 *************** *** 128,136 **** * implementation and set the sort order to something other than manual. * @param trackid the id of the track to add. Doesn't check if the track actually exists * @param position the position field as found in the itunesdb mhip playlist item, or -1 if the item should just be appended to the list * @return the index of the item in the list or -1 if the item could not be added or the item was NULL * @see @c ITunesDBPlaylist for a full implementation of itunesDBs playlists */ ! int addPlaylistItem( Q_UINT32 trackid, int position = -1 ); /** --- 128,138 ---- * implementation and set the sort order to something other than manual. * @param trackid the id of the track to add. Doesn't check if the track actually exists + * @param track_dateadded the date the track was added to the database + * @param trackDBid the DB id of the track to add. * @param position the position field as found in the itunesdb mhip playlist item, or -1 if the item should just be appended to the list * @return the index of the item in the list or -1 if the item could not be added or the item was NULL * @see @c ITunesDBPlaylist for a full implementation of itunesDBs playlists */ ! int addPlaylistItem( Q_UINT32 trackid, Q_UINT32 track_dateadded = 0, Q_UINT64 trackDBid = 0, int position = -1 ); /** *************** *** 254,260 **** if ( trackIter.hasNext() ) { setDirty(); ! do { ! addPlaylistItem( trackIter.next()->getID() ); ! } while( trackIter.hasNext() ); } } --- 256,262 ---- if ( trackIter.hasNext() ) { setDirty(); ! for( ; !trackIter.atEnd(); ++trackIter ) { ! addPlaylistItem( (*trackIter)->getID(), (*trackIter)->getDateAdded(), (*trackIter)->getDBID() ); ! } } } *************** *** 267,271 **** bool changed = false; for ( ; trackIter != end; trackIter++ ) { ! addPlaylistItem( (*trackIter)->getID() ); changed = true; } --- 269,273 ---- bool changed = false; for ( ; trackIter != end; trackIter++ ) { ! addPlaylistItem( (*trackIter)->getID(), (*trackIter)->getDateAdded(), (*trackIter)->getDBID() ); changed = true; } *************** *** 284,288 **** * Creates a new PlaylistItem. Override this method if you need your own PlaylistItem implementation. */ ! virtual PlaylistItem * createNewItem( Q_UINT32 trackid ); virtual QDataStream & readFromStream( QDataStream & instream, bool * ok = NULL ); --- 286,290 ---- * Creates a new PlaylistItem. Override this method if you need your own PlaylistItem implementation. */ ! virtual PlaylistItem * createNewItem( Q_UINT32 trackid, Q_UINT32 track_dateadded = 0, Q_UINT64 trackDBid = 0 ); virtual QDataStream & readFromStream( QDataStream & instream, bool * ok = NULL ); Index: itunesdb.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdb.h,v retrieving revision 1.86 retrieving revision 1.87 diff -C2 -d -r1.86 -r1.87 *** itunesdb.h 21 Jan 2008 21:53:11 -0000 1.86 --- itunesdb.h 23 Jan 2008 23:48:26 -0000 1.87 *************** *** 187,191 **** friend class ITunesDBPlaylist; unsigned int m_mhitTrackPos; ! Entry( Q_UINT32 id, uint trackpos ); void setTrackDetails( int mhitTrackPos, const itunesdb::Track * track ); public: --- 187,191 ---- friend class ITunesDBPlaylist; unsigned int m_mhitTrackPos; ! Entry( Q_UINT32 id, Q_UINT32 track_dateadded, Q_UINT64 track_dbid, uint trackpos ); void setTrackDetails( int mhitTrackPos, const itunesdb::Track * track ); public: *************** *** 202,206 **** * Creates a new instance of the Entry class. */ ! virtual itunesdb::PlaylistItem * createNewItem( Q_UINT32 itemid ); /** --- 202,206 ---- * Creates a new instance of the Entry class. */ ! virtual itunesdb::PlaylistItem * createNewItem( Q_UINT32 itemid, Q_UINT32 track_dateadded = 0, Q_UINT64 trackDBid = 0 ); /** Index: itunesdbwriter.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbwriter.cpp,v retrieving revision 1.34 retrieving revision 1.35 diff -C2 -d -r1.34 -r1.35 *** itunesdbwriter.cpp 21 Jan 2008 21:53:11 -0000 1.34 --- itunesdbwriter.cpp 23 Jan 2008 23:48:26 -0000 1.35 *************** *** 297,301 **** TrackPtrList::Iterator trackIter = m_trackPtrList.iterator(); while( trackIter.hasNext() ) { ! addPlaylistItem( trackIter.next()->getID() ); } for ( uint i = 0; i < m_trackCount; ++i ) { --- 297,302 ---- TrackPtrList::Iterator trackIter = m_trackPtrList.iterator(); while( trackIter.hasNext() ) { ! Track * current = trackIter.next(); ! addPlaylistItem( current->getID(), current->getDateAdded(), current->getDBID() ); } for ( uint i = 0; i < m_trackCount; ++i ) { |
From: Michael S. <fr...@us...> - 2008-01-21 21:53:09
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv21849/src Modified Files: itunesdb.h itunesdbwriter.cpp itunesdb.cpp Log Message: current development Index: itunesdb.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdb.h,v retrieving revision 1.85 retrieving revision 1.86 diff -C2 -d -r1.85 -r1.86 *** itunesdb.h 14 Jan 2008 21:03:59 -0000 1.85 --- itunesdb.h 21 Jan 2008 21:53:11 -0000 1.86 *************** *** 188,191 **** --- 188,192 ---- unsigned int m_mhitTrackPos; Entry( Q_UINT32 id, uint trackpos ); + void setTrackDetails( int mhitTrackPos, const itunesdb::Track * track ); public: virtual ~Entry(); Index: itunesdbwriter.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbwriter.cpp,v retrieving revision 1.33 retrieving revision 1.34 diff -C2 -d -r1.33 -r1.34 *** itunesdbwriter.cpp 19 Jan 2008 19:54:35 -0000 1.33 --- itunesdbwriter.cpp 21 Jan 2008 21:53:11 -0000 1.34 *************** *** 282,286 **** }*/ - class MasterPlaylist : public itunesdb::Playlist { TrackPtrList & m_trackPtrList; --- 282,285 ---- *************** *** 345,352 **** // write MHOD 53 MHOD53EntryList entrylist; ! MHOD53entry entry; MHOD53entry tailDigitEntry; ! // start and end may be non-letters entry.letter = '0'; --- 344,351 ---- // write MHOD 53 MHOD53EntryList entrylist; ! MHOD53entry entry; MHOD53entry tailDigitEntry; ! // start and end may be non-letters entry.letter = '0'; *************** *** 417,423 **** entrylist.push_back( tailDigitEntry ); } ! std::sort( entrylist.begin(), entrylist.end() ); ! // write the MHOD stream << (Q_UINT32) 0x646F686D; // mhod --- 416,422 ---- entrylist.push_back( tailDigitEntry ); } ! std::sort( entrylist.begin(), entrylist.end() ); ! // write the MHOD stream << (Q_UINT32) 0x646F686D; // mhod *************** *** 430,434 **** stream << (Q_UINT32) entrylist.size(); stream << (Q_UINT64) 0; ! MHOD53EntryList::iterator entryIter = entrylist.begin(); for ( ; entryIter != entrylist.end(); ++entryIter ) { --- 429,433 ---- stream << (Q_UINT32) entrylist.size(); stream << (Q_UINT64) 0; ! MHOD53EntryList::iterator entryIter = entrylist.begin(); for ( ; entryIter != entrylist.end(); ++entryIter ) { *************** *** 464,468 **** } ! unsigned int writeMHOD52( QDataStream& stream, uint sortIndex, const TrackComparatorPtr& comparator ) const { stream << (Q_UINT32) 0x646F686D; // mhod --- 463,467 ---- } ! unsigned int writeMHOD52( QDataStream& stream, uint sortIndex, const TrackComparatorPtr& comparator ) const { stream << (Q_UINT32) 0x646F686D; // mhod *************** *** 484,492 **** stream << (Q_UINT32) m_indices[ i ]; } ! return 1; } ! virtual unsigned int writeNonStringMHODs( QDataStream& outstream ) const { unsigned int numMHOD = 0; --- 483,491 ---- stream << (Q_UINT32) m_indices[ i ]; } ! return 1; } ! virtual unsigned int writeNonStringMHODs( QDataStream& outstream ) const { unsigned int numMHOD = 0; *************** *** 506,510 **** // writeMHOD52( outstream, 0x1E, TrackComparators::BY_SEASON ); // writeMHOD52( outstream, 0x1F, TrackComparators::BY_EPISODE ); ! numMHOD += writeMHOD52( outstream, 0x23, TrackComparators::BY_ALBUMARTIST ); numMHOD += writeMHOD52( outstream, 0x24, TrackComparators::BY_ARTISTFIELD ); --- 505,509 ---- // writeMHOD52( outstream, 0x1E, TrackComparators::BY_SEASON ); // writeMHOD52( outstream, 0x1F, TrackComparators::BY_EPISODE ); ! numMHOD += writeMHOD52( outstream, 0x23, TrackComparators::BY_ALBUMARTIST ); numMHOD += writeMHOD52( outstream, 0x24, TrackComparators::BY_ARTISTFIELD ); Index: itunesdb.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdb.cpp,v retrieving revision 1.114 retrieving revision 1.115 diff -C2 -d -r1.114 -r1.115 *** itunesdb.cpp 18 Jan 2008 22:23:16 -0000 1.114 --- itunesdb.cpp 21 Jan 2008 21:53:11 -0000 1.115 *************** *** 137,141 **** PlaylistItem * ITunesDBPlaylist::createNewItem( Q_UINT32 itemid ) { int trackpos = m_itunesdb.getMHITTrackPosFor( itemid ); ! return new ITunesDBPlaylist::Entry( itemid, trackpos ); } --- 137,145 ---- PlaylistItem * ITunesDBPlaylist::createNewItem( Q_UINT32 itemid ) { int trackpos = m_itunesdb.getMHITTrackPosFor( itemid ); ! ITunesDBPlaylist::Entry * result = new ITunesDBPlaylist::Entry( itemid, trackpos ); ! if ( itemid > 0 && trackpos >= 0 ) { ! result->setTrackDetails( trackpos, m_itunesdb.getTrackAt( trackpos ) ); ! } ! return result; } *************** *** 192,201 **** printf( "MHOD52: sortindex = %x, trackcount = %d\n", sortindex, trackcount ); ! itunesdb::utils::seekRelative( stream, 40 ); for ( uint i = 0; i < trackcount; i++ ) { Q_UINT32 idx; stream >> idx; ITunesDBTrack * track = m_itunesdb.getTrackAt( idx ); ! printf( "%s - %s - %d-%s - %s - %s - %s\n", track->getArtist().ascii(), --- 196,205 ---- printf( "MHOD52: sortindex = %x, trackcount = %d\n", sortindex, trackcount ); ! itunesdb::utils::seekRelative( stream, 40 ); for ( uint i = 0; i < trackcount; i++ ) { Q_UINT32 idx; stream >> idx; ITunesDBTrack * track = m_itunesdb.getTrackAt( idx ); ! printf( "%s - %s - %d-%s - %s - %s - %s\n", track->getArtist().ascii(), *************** *** 242,245 **** --- 246,260 ---- + void ITunesDBPlaylist::Entry::setTrackDetails( int mhittrackpos, const Track * track ) { + if ( !track || mhittrackpos < 0 ) { + return; + } + m_mhitTrackPos = mhittrackpos; + m_trackid = track->getID(); + m_trackdbid = track->getDBID(); + m_trackdateadded = track->getDateAdded(); + } + + void ITunesDBPlaylist::doPostParsingChecks() { Iterator track_iter= getElements(); *************** *** 253,261 **** int trackpos = m_itunesdb.getMHITTrackPosFor( entry->getID() ); if ( trackpos < 0 ) { // track couldn't be found ! removeTrackAt( track_iter); continue; } ! ! entry->m_mhitTrackPos = trackpos; } setSortOrder( getSortOrder() ); --- 268,275 ---- int trackpos = m_itunesdb.getMHITTrackPosFor( entry->getID() ); if ( trackpos < 0 ) { // track couldn't be found ! removeTrackAt( track_iter ); continue; } ! entry->setTrackDetails( trackpos, m_itunesdb.getTrackAt( trackpos ) ); } setSortOrder( getSortOrder() ); |
From: Michael S. <fr...@us...> - 2008-01-19 19:54:47
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv24615/src Modified Files: itunesdbwriter.cpp itunesdbparser.cpp playlist.cpp itunesdb_rw.cpp playlistitem.h utils.h track.cpp listitem.h playlistitem.cpp Log Message: current podcast development Index: itunesdb_rw.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdb_rw.cpp,v retrieving revision 1.38 retrieving revision 1.39 diff -C2 -d -r1.38 -r1.39 *** itunesdb_rw.cpp 18 Jan 2008 22:23:16 -0000 1.38 --- itunesdb_rw.cpp 19 Jan 2008 19:54:35 -0000 1.39 *************** *** 181,184 **** --- 181,199 ---- } } + Playlist::Iterator iter = playlist->getElements(); + while( iter.hasNext() ) { + PlaylistItem * item = iter.next(); + Track * track = m_itunesdb.getTrackByID( item->getID() ); + if ( !track ) { + printf( "ATTENTION: track not found for ID %d\n", item->getID() ); + continue; + } + if ( track->getDateAdded() != item->getTrackDateAdded() ) { + printf( "ATTENTION: track.dateadded != item.trackdateadded\n" ); + } + if ( track->getDBID() != item->getTrackDBID() ) { + printf( "ATTENTION: track.dbid != item.trackdbid\n" ); + } + } #endif // This has to be before the podcast check since we really need the FIRST playlist after Index: utils.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/utils.h,v retrieving revision 1.56 retrieving revision 1.57 diff -C2 -d -r1.56 -r1.57 *** utils.h 21 Dec 2007 09:14:11 -0000 1.56 --- utils.h 19 Jan 2008 19:54:35 -0000 1.57 *************** *** 823,826 **** --- 823,833 ---- + inline void checkMacEpochDate( Q_UINT32& date ) { + if ( date ) { + date -= MAC_EPOCH_DELTA; + } + } + + } // utils Index: playlist.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlist.cpp,v retrieving revision 1.69 retrieving revision 1.70 diff -C2 -d -r1.69 -r1.70 *** playlist.cpp 18 Jan 2008 22:23:16 -0000 1.69 --- playlist.cpp 19 Jan 2008 19:54:35 -0000 1.70 *************** *** 27,30 **** --- 27,31 ---- #include "utils.h" + #include "itunesdbwriter.h" namespace itunesdb { *************** *** 79,84 **** if ( blocklen < 48 ) { // insufficient information ! QByteArray buffer( blocklen ); ! instream.readRawBytes(buffer.data(), blocklen - 8); if ( ok ) { --- 80,84 ---- if ( blocklen < 48 ) { // insufficient information ! itunesdb::utils::seekRelative( instream, blocklen - 8 ); if ( ok ) { *************** *** 410,430 **** title = "KPod"; } ! const char *data = (const char *)title.ucs2(); ! if( data == NULL ) { ! return; ! } ! ! int datalen= 2* title.length(); ! stream << (Q_UINT32) 0x646F686D; // mhod ! stream << (Q_UINT32) 0x18; ! stream << (Q_UINT32) 40+ datalen; ! stream << (Q_UINT32) MHOD_TITLE; ! stream << (Q_UINT32) 0; ! stream << (Q_UINT32) 0; ! stream << (Q_UINT32) 1; // dummy - would refer to the trackID if used in playlist ! stream << (Q_UINT32) datalen; ! stream << (Q_UINT32) 0; ! stream << (Q_UINT32) 0; ! stream.writeRawBytes( data, datalen); } --- 410,415 ---- title = "KPod"; } ! ! ItunesDBWriter::writeUTF16StringTypeMHOD( stream, MHOD_TITLE, title ); } *************** *** 485,510 **** int pos = 1; while( trackiterator.hasNext()) { ! Q_UINT32 trackid= trackiterator.next()->getID(); ! ! stream << (Q_UINT32) 0x7069686D; // mhip ! stream << (Q_UINT32) 0x4C; // headerlen ! stream << (Q_UINT32) 0x78; // datalen ! stream << (Q_UINT32) 1; ! stream << (Q_UINT32) 0; ! stream << (Q_UINT32) pos; ! stream << (Q_UINT32) trackid; ! for ( int i = 0; i < 12; i++) { ! stream << (Q_UINT32) 0; ! } ! stream << (Q_UINT32) 0x646F686D; // mhod ! stream << (Q_UINT32) 0x18; ! stream << (Q_UINT32) 0x2C; ! stream << (Q_UINT32) MHOD_PLAYLIST; // type: playlist ! stream << (Q_UINT32) 0; ! stream << (Q_UINT32) 0; ! stream << (Q_UINT32) pos; ! for( int i= 0; i< 4; i++) ! stream << (Q_UINT32) 0; ! pos++; } } --- 470,476 ---- int pos = 1; while( trackiterator.hasNext()) { ! PlaylistItem * item = trackiterator.next(); ! item->setPosition( pos++ ); ! item->writeToStream( stream ); } } Index: listitem.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/listitem.h,v retrieving revision 1.27 retrieving revision 1.28 diff -C2 -d -r1.27 -r1.28 *** listitem.h 18 Jan 2008 22:23:16 -0000 1.27 --- listitem.h 19 Jan 2008 19:54:35 -0000 1.28 *************** *** 164,167 **** --- 164,169 ---- Q_UINT64 getDBID() const { return m_dbid; } + void setDBID( Q_UINT64 dbid ) { m_dbid = dbid; } + protected: *************** *** 169,174 **** PropertyMap m_properties; - void setDBID( Q_UINT64 dbid ) { m_dbid = dbid; } - Q_UINT64 m_dbid; --- 171,174 ---- Index: playlistitem.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlistitem.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** playlistitem.cpp 18 Jan 2008 22:23:15 -0000 1.10 --- playlistitem.cpp 19 Jan 2008 19:54:35 -0000 1.11 *************** *** 25,39 **** #include "utils.h" namespace itunesdb { PlaylistItem::PlaylistItem( Q_UINT32 track_id ) ! : ListItem( ITEMTYPE_PLAYLISTITEM), m_trackid( track_id ), m_pos( PLAYLISTITEM_INVALID ) { } PlaylistItem::PlaylistItem() ! : ListItem( ITEMTYPE_PLAYLISTITEM), m_pos( PLAYLISTITEM_INVALID ) { - m_trackid = PLAYLISTITEM_INVALID; } --- 25,44 ---- #include "utils.h" + #include <qbuffer.h> + namespace itunesdb { PlaylistItem::PlaylistItem( Q_UINT32 track_id ) ! : ListItem( ITEMTYPE_PLAYLISTITEM ), m_podcastgroupflag( 0 ), m_unk4unk5( 0 ), m_groupid( 0 ), ! m_trackid( track_id ), m_trackdateadded( 0 ), m_groupref( 0 ), m_trackdbid( 0 ), ! m_pos( PLAYLISTITEM_INVALID ) { } PlaylistItem::PlaylistItem() ! : ListItem( ITEMTYPE_PLAYLISTITEM ), m_podcastgroupflag( 0 ), m_unk4unk5( 0 ), m_groupid( 0 ), ! m_trackid( PLAYLISTITEM_INVALID ), m_trackdateadded( 0 ), m_groupref( 0 ), m_trackdbid( 0 ), ! m_pos( PLAYLISTITEM_INVALID ) { } *************** *** 55,66 **** QDataStream & PlaylistItem::readFromStream( QDataStream & instream, bool * ok ) { Q_UINT32 dummy, blocklen; instream >> blocklen; // 8 bytes read ! #if 0 ! if ( blocklen < ) { ! // insufficient information ! QByteArray buffer( blocklen ); ! instream.readRawBytes(buffer.data(), blocklen - 8); if ( ok ) { --- 60,72 ---- QDataStream & PlaylistItem::readFromStream( QDataStream & instream, bool * ok ) { Q_UINT32 dummy, blocklen; + unsigned int bytesread; + instream >> blocklen; // 8 bytes read ! if ( blocklen < 28 ) { ! // insufficient information - skip element plus child records ! instream >> blocklen; ! itunesdb::utils::seekRelative( instream, blocklen - 12 ); if ( ok ) { *************** *** 70,76 **** return instream; } ! #endif } Q_UINT32 PlaylistItem::getID() const { return m_trackid; --- 76,160 ---- return instream; } ! ! instream >> dummy; // length incl child records ! instream >> dummy; // number of mhods ! instream >> m_podcastgroupflag; ! instream >> m_unk4unk5; ! instream >> m_groupid; ! instream >> m_trackid; ! ! bytesread = 28; ! ! if ( blocklen >= 36 ) { ! instream >> m_trackdateadded; ! utils::checkMacEpochDate( m_trackdateadded ); ! instream >> m_groupref; ! bytesread = 36; ! } ! if ( blocklen >=52 ) { ! instream >> dummy; // dunno ! instream >> dummy; // dunno ! instream >> m_trackdbid; ! bytesread = 52; ! } ! // skip the rest ! itunesdb::utils::seekRelative( instream, blocklen - bytesread ); ! ! if ( ok ) { ! *ok = true; ! } ! return instream; } + + QDataStream & PlaylistItem::writeToStream( QDataStream & outstream ) { + QBuffer buffer; + buffer.open(IO_WriteOnly); + QDataStream stream( &buffer); + stream.setByteOrder( QDataStream::LittleEndian); + + // write the header + stream << (Q_UINT32) 0x7069686D; // mhip + stream << (Q_UINT32) 0x4C; // headerlen + stream << (Q_UINT32) 0; // length - set later + stream << (Q_UINT32) 0; + stream << (Q_UINT16) m_podcastgroupflag; + stream << (Q_UINT16) m_unk4unk5; + stream << (Q_UINT32) m_groupid; + stream << (Q_UINT32) m_trackid; + stream << (Q_UINT32) m_trackdateadded; + stream << (Q_UINT32) m_groupref; + stream << (Q_UINT64) 0; + stream << (Q_UINT64) m_trackdbid; + + for( int i= 0; i < 6; i++) { + stream << (Q_UINT32) 0; // pad the rest + } + + uint numMHODs = writeMHODsToStream( stream ); + if ( !isPodcastGroup() ) { + stream << (Q_UINT32) 0x646F686D; // mhod + stream << (Q_UINT32) 0x18; + stream << (Q_UINT32) 0x2C; + stream << (Q_UINT32) MHOD_PLAYLIST; // type: playlist + stream << (Q_UINT32) 0; + stream << (Q_UINT32) 0; + stream << (Q_UINT32) m_pos; + for( int i = 0; i < 4; i++ ) { + stream << (Q_UINT32) 0; + } + } + + buffer.at( 8 ); + stream << (Q_UINT32) buffer.size(); + stream << (Q_UINT32) numMHODs; + buffer.close(); + + outstream.writeRawBytes( buffer.buffer().data(), buffer.size() ); + + return outstream; + } + + Q_UINT32 PlaylistItem::getID() const { return m_trackid; Index: playlistitem.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlistitem.h,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** playlistitem.h 18 Jan 2008 22:23:15 -0000 1.16 --- playlistitem.h 19 Jan 2008 19:54:35 -0000 1.17 *************** *** 64,72 **** */ bool isPositionSet() const { return m_pos != PLAYLISTITEM_INVALID; } protected: PlaylistItem(); ! PlaylistItem( Q_UINT32 track_id); /** --- 64,85 ---- */ bool isPositionSet() const { return m_pos != PLAYLISTITEM_INVALID; } + + Q_UINT32 getTrackDateAdded() const { return m_trackdateadded; } + + Q_UINT64 getTrackDBID() const { return m_trackdbid; } + + bool isPodcastGroup() const { return m_podcastgroupflag; } + + Q_UINT32 getGroupID() const { return m_groupid; } + + Q_UINT32 getGroupRef() const { return m_groupref; } + + virtual QDataStream & readFromStream( QDataStream & instream, bool * ok = NULL ); + virtual QDataStream & writeToStream( QDataStream & outstream ); protected: PlaylistItem(); ! PlaylistItem( Q_UINT32 track_id ); /** *************** *** 80,91 **** virtual bool readMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ); ! virtual QDataStream & readFromStream( QDataStream & instream, bool * ok = NULL ); ! Q_UINT16 m_podcastgroupflag; Q_UINT16 m_unk4unk5; Q_UINT32 m_groupid; Q_UINT32 m_trackid; ! Q_UINT32 m_weirdotimestamp; Q_UINT32 m_groupref; Q_UINT32 m_pos; }; --- 93,105 ---- virtual bool readMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ); ! // TODO FIXME these fields need to be filled/handled Q_UINT16 m_podcastgroupflag; Q_UINT16 m_unk4unk5; Q_UINT32 m_groupid; Q_UINT32 m_trackid; ! Q_UINT32 m_trackdateadded; Q_UINT32 m_groupref; + Q_UINT64 m_trackdbid; + Q_UINT32 m_pos; }; Index: track.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/track.cpp,v retrieving revision 1.75 retrieving revision 1.76 diff -C2 -d -r1.75 -r1.76 *** track.cpp 18 Jan 2008 22:23:16 -0000 1.75 --- track.cpp 19 Jan 2008 19:54:35 -0000 1.76 *************** *** 677,686 **** - inline void checkMacEpochDate( Q_UINT32& date ) { - if ( date ) { - date -= MAC_EPOCH_DELTA; - } - } - QDataStream & Track::readFromStream( QDataStream& instream, bool * ok ) { Q_UINT32 dummy, blocklen; --- 677,680 ---- *************** *** 690,695 **** if ( blocklen < 108 ) { // insufficient information ! QByteArray buffer( blocklen ); ! instream.readRawBytes( buffer.data(), blocklen - numread ); if ( ok ) { *ok = false; --- 684,689 ---- if ( blocklen < 108 ) { // insufficient information ! itunesdb::utils::seekRelative( instream, blocklen - numread ); ! if ( ok ) { *ok = false; *************** *** 709,713 **** instream >> rating; // 31 instream >> lastmodified; // 32 ! checkMacEpochDate( lastmodified ); instream >> file_size; --- 703,707 ---- instream >> rating; // 31 instream >> lastmodified; // 32 ! utils::checkMacEpochDate( lastmodified ); instream >> file_size; *************** *** 728,732 **** instream >> dummy; instream >> last_played_at; ! checkMacEpochDate( last_played_at ); instream >> cdnum; // 94 --- 722,726 ---- instream >> dummy; instream >> last_played_at; ! utils::checkMacEpochDate( last_played_at ); instream >> cdnum; // 94 *************** *** 735,739 **** instream >> dummy; // 100 instream >> date_added; // 104 ! checkMacEpochDate( date_added ); // 108 byte read so far --- 729,733 ---- instream >> dummy; // 100 instream >> date_added; // 104 ! utils::checkMacEpochDate( date_added ); // 108 byte read so far *************** *** 764,768 **** instream >> mSkipCount; // 156 instream >> mLastSkippedDate; // 160 ! checkMacEpochDate( mLastSkippedDate ); instream >> mHasArtwork; // 164 instream >> mSkipWhenShuffe; // 165 --- 758,762 ---- instream >> mSkipCount; // 156 instream >> mLastSkippedDate; // 160 ! utils::checkMacEpochDate( mLastSkippedDate ); instream >> mHasArtwork; // 164 instream >> mSkipWhenShuffe; // 165 Index: itunesdbwriter.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbwriter.cpp,v retrieving revision 1.32 retrieving revision 1.33 diff -C2 -d -r1.32 -r1.33 *** itunesdbwriter.cpp 18 Jan 2008 22:23:15 -0000 1.32 --- itunesdbwriter.cpp 19 Jan 2008 19:54:35 -0000 1.33 *************** *** 183,187 **** fillTrackBufferSD( trackdata ); // write track data ! stream.writeRawBytes( trackdata.data(), trackdata.size()); file.close(); --- 183,187 ---- fillTrackBufferSD( trackdata ); // write track data ! stream.writeRawBytes( trackdata.data(), trackdata.size() ); file.close(); Index: itunesdbparser.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbparser.cpp,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** itunesdbparser.cpp 14 Jan 2008 21:03:59 -0000 1.21 --- itunesdbparser.cpp 19 Jan 2008 19:54:35 -0000 1.22 *************** *** 215,236 **** break; case 0x7069686D: { // mhip: PlaylistItem - Q_UINT32 itemid; - - stream >> blocklen; if( listitem != NULL ) { handleItem( *listitem ); } - itunesdb::utils::seekRelative( stream, 16 ); - stream >> itemid; - current_playlistitem = NULL; if ( current_playlist ) { ! current_playlistitem = current_playlist->createNewItem( itemid ); ! listitem = current_playlistitem; } - itunesdb::utils::seekRelative( stream, blocklen - 28 ); } break; --- 215,243 ---- break; case 0x7069686D: { // mhip: PlaylistItem if( listitem != NULL ) { handleItem( *listitem ); } current_playlistitem = NULL; if ( current_playlist ) { ! current_playlistitem = current_playlist->createNewItem( 0 ); ! bool ok = false; ! current_playlistitem->readFromStream( stream, &ok ); ! if ( !ok ) { ! delete current_playlistitem; ! current_playlistitem = NULL; ! } else { ! listitem = current_playlistitem; ! } ! ! } else { ! // skip element plus child records ! stream >> blocklen; ! stream >> blocklen; ! itunesdb::utils::seekRelative( stream, blocklen - 12 ); ! } } break; |
From: Michael S. <fr...@us...> - 2008-01-18 22:32:42
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv31005/src Modified Files: Tag: branch_0_4 src.pro Log Message: version increment Index: src.pro =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/src.pro,v retrieving revision 1.26.2.1 retrieving revision 1.26.2.2 diff -C2 -d -r1.26.2.1 -r1.26.2.2 *** src.pro 15 Dec 2007 18:16:07 -0000 1.26.2.1 --- src.pro 18 Jan 2008 22:32:41 -0000 1.26.2.2 *************** *** 9,13 **** libqtpodincludes.path = $${QMAKE_INCDIR}/libqtpod TARGET = qtpod ! VERSION = 0.4.2 target.path = $$QMAKE_LIBDIR win32 { --- 9,13 ---- libqtpodincludes.path = $${QMAKE_INCDIR}/libqtpod TARGET = qtpod ! VERSION = 0.4.3 target.path = $$QMAKE_LIBDIR win32 { |
From: Michael S. <fr...@us...> - 2008-01-18 22:30:14
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv29908/src Modified Files: Tag: branch_0_4 listitem.cpp Log Message: resolved TODOs Index: listitem.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/listitem.cpp,v retrieving revision 1.26.2.1 retrieving revision 1.26.2.2 diff -C2 -d -r1.26.2.1 -r1.26.2.2 *** listitem.cpp 18 Jan 2008 22:27:52 -0000 1.26.2.1 --- listitem.cpp 18 Jan 2008 22:30:10 -0000 1.26.2.2 *************** *** 332,339 **** case MHOD_DESCRIPTION_TEXT: case MHOD_SUBTITLE: ! // TODO check for these with the libqpod impl ! // case MHOD_TVSHOW: ! // case MHOD_TVEPISODE: ! // case MHOD_TVNETWORK: case MHOD_ALBUMARTIST: case MHOD_ARTIST_FOR_SORT: --- 332,338 ---- case MHOD_DESCRIPTION_TEXT: case MHOD_SUBTITLE: ! case MHOD_TVSHOW: ! case MHOD_TVEPISODE: ! case MHOD_TVNETWORK: case MHOD_ALBUMARTIST: case MHOD_ARTIST_FOR_SORT: |
From: Michael S. <fr...@us...> - 2008-01-18 22:30:04
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv29824/src Modified Files: listitem.cpp Log Message: resolved TODOs Index: listitem.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/listitem.cpp,v retrieving revision 1.31 retrieving revision 1.32 diff -C2 -d -r1.31 -r1.32 *** listitem.cpp 18 Jan 2008 22:23:15 -0000 1.31 --- listitem.cpp 18 Jan 2008 22:30:05 -0000 1.32 *************** *** 327,334 **** case MHOD_DESCRIPTION_TEXT: case MHOD_SUBTITLE: ! // TODO check for these with the libqpod impl ! // case MHOD_TVSHOW: ! // case MHOD_TVEPISODE: ! // case MHOD_TVNETWORK: case MHOD_ALBUMARTIST: case MHOD_ARTIST_FOR_SORT: --- 327,333 ---- case MHOD_DESCRIPTION_TEXT: case MHOD_SUBTITLE: ! case MHOD_TVSHOW: ! case MHOD_TVEPISODE: ! case MHOD_TVNETWORK: case MHOD_ALBUMARTIST: case MHOD_ARTIST_FOR_SORT: |
From: Michael S. <fr...@us...> - 2008-01-18 22:27:51
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv28930/src Modified Files: Tag: branch_0_4 listitem.cpp Log Message: resolved TODOs Index: listitem.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/listitem.cpp,v retrieving revision 1.26 retrieving revision 1.26.2.1 diff -C2 -d -r1.26 -r1.26.2.1 *** listitem.cpp 8 Dec 2007 14:10:30 -0000 1.26 --- listitem.cpp 18 Jan 2008 22:27:52 -0000 1.26.2.1 *************** *** 48,55 **** case MHOD_DESCRIPTION_TEXT: case MHOD_SUBTITLE: ! // TODO check for these with the libqpod impl ! // case MHOD_TVSHOW: ! // case MHOD_TVEPISODE: ! // case MHOD_TVNETWORK: case MHOD_ALBUMARTIST: case MHOD_ARTIST_FOR_SORT: --- 48,54 ---- case MHOD_DESCRIPTION_TEXT: case MHOD_SUBTITLE: ! case MHOD_TVSHOW: ! case MHOD_TVEPISODE: ! case MHOD_TVNETWORK: case MHOD_ALBUMARTIST: case MHOD_ARTIST_FOR_SORT: *************** *** 179,186 **** case MHOD_DESCRIPTION_TEXT: case MHOD_SUBTITLE: ! // TODO check for these with the libqpod impl ! // case MHOD_TVSHOW: ! // case MHOD_TVEPISODE: ! // case MHOD_TVNETWORK: case MHOD_ALBUMARTIST: case MHOD_ARTIST_FOR_SORT: --- 178,184 ---- case MHOD_DESCRIPTION_TEXT: case MHOD_SUBTITLE: ! case MHOD_TVSHOW: ! case MHOD_TVEPISODE: ! case MHOD_TVNETWORK: case MHOD_ALBUMARTIST: case MHOD_ARTIST_FOR_SORT: |
From: Michael S. <fr...@us...> - 2008-01-18 22:23:15
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv27132/src Modified Files: playlistitem.h itunesdbwriter.h playlistitem.cpp track.h listitem.cpp itunesdbwriter.cpp playlist.h playlist.cpp itunesdb.cpp track.cpp listitem.h itunesdb_rw.cpp Log Message: fixed wirting MHOD53, moved dbid to listitem base class and other current development Index: listitem.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/listitem.cpp,v retrieving revision 1.30 retrieving revision 1.31 diff -C2 -d -r1.30 -r1.31 *** listitem.cpp 14 Jan 2008 21:03:59 -0000 1.30 --- listitem.cpp 18 Jan 2008 22:23:15 -0000 1.31 *************** *** 75,83 **** }; ! ListItem::ListItem(int type) : m_dirty( true ) { m_itemType = type; } ! ListItem::ListItem() : m_dirty( true ) { m_itemType = ITEMTYPE_NONE; } --- 75,83 ---- }; ! ListItem::ListItem( int type ) : m_dbid( 0 ), m_dirty( true ) { m_itemType = type; } ! ListItem::ListItem() : m_dbid( 0 ), m_dirty( true ) { m_itemType = ITEMTYPE_NONE; } Index: playlist.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlist.cpp,v retrieving revision 1.68 retrieving revision 1.69 diff -C2 -d -r1.68 -r1.69 *** playlist.cpp 14 Jan 2008 21:03:59 -0000 1.68 --- playlist.cpp 18 Jan 2008 22:23:16 -0000 1.69 *************** *** 45,49 **** Playlist::Playlist() : ListItem( ITEMTYPE_PLAYLIST ), m_tracklist( true ), m_isMaster( 0 ), m_flag2( 0 ), ! m_flag3( 0 ), m_flag4( 0 ), timeStamp( 0 ), m_id( 0 ), unk3( 0 ), mIsPodcast( 0 ), m_order( SORTORDER_MANUAL ), mSplRuleSet( NULL ) { --- 45,49 ---- Playlist::Playlist() : ListItem( ITEMTYPE_PLAYLIST ), m_tracklist( true ), m_isMaster( 0 ), m_flag2( 0 ), ! m_flag3( 0 ), m_flag4( 0 ), timeStamp( 0 ), unk3( 0 ), mIsPodcast( 0 ), m_order( SORTORDER_MANUAL ), mSplRuleSet( NULL ) { *************** *** 54,58 **** Playlist::Playlist( const Playlist& src ) : ListItem( src ), m_tracklist( true ), m_isMaster( src.m_isMaster ), ! timeStamp( src.timeStamp ), m_id( src.m_id ), unk3( src.unk3 ), mIsPodcast( src.mIsPodcast ), m_order( src.m_order ), mSplRuleSet( NULL ) { --- 54,58 ---- Playlist::Playlist( const Playlist& src ) : ListItem( src ), m_tracklist( true ), m_isMaster( src.m_isMaster ), ! timeStamp( src.timeStamp ), unk3( src.unk3 ), mIsPodcast( src.mIsPodcast ), m_order( src.m_order ), mSplRuleSet( NULL ) { *************** *** 100,104 **** instream >> m_flag4; instream >> timeStamp; ! instream >> m_id; // 36 bytes read --- 100,104 ---- instream >> m_flag4; instream >> timeStamp; ! instream >> m_dbid; // 36 bytes read *************** *** 277,285 **** - void Playlist::setID( Q_UINT64 id ) { - m_id = id; - } - - void Playlist::clear() { m_tracklist.clear(); --- 277,280 ---- *************** *** 538,542 **** stream << (Q_UINT8) m_flag4; stream << (Q_UINT32) timeStamp; ! stream << m_id; stream << (Q_UINT32) unk3; // unknown, but significant stream << (Q_UINT16) getNumStringComponents(); // number of string MHODs --- 533,537 ---- stream << (Q_UINT8) m_flag4; stream << (Q_UINT32) timeStamp; ! stream << (Q_UINT64) m_dbid; stream << (Q_UINT32) unk3; // unknown, but significant stream << (Q_UINT16) getNumStringComponents(); // number of string MHODs Index: listitem.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/listitem.h,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** listitem.h 14 Jan 2008 21:03:59 -0000 1.26 --- listitem.h 18 Jan 2008 22:23:16 -0000 1.27 *************** *** 158,166 **** virtual bool isDirty() const; protected: - typedef std::map<Q_UINT32,QString> PropertyMap; PropertyMap m_properties; ListItem(); ListItem( int type); --- 158,176 ---- virtual bool isDirty() const; + /** + * Returns the DBID which refers to additional media associated to this item (like cover art) + * @return the DBID for this item + */ + Q_UINT64 getDBID() const { return m_dbid; } + protected: + typedef std::map<Q_UINT32,QString> PropertyMap; PropertyMap m_properties; + void setDBID( Q_UINT64 dbid ) { m_dbid = dbid; } + + Q_UINT64 m_dbid; + ListItem(); ListItem( int type); *************** *** 182,186 **** --- 192,198 ---- private: + bool m_dirty; + }; Index: playlistitem.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlistitem.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** playlistitem.cpp 14 Jan 2008 21:03:59 -0000 1.9 --- playlistitem.cpp 18 Jan 2008 22:23:15 -0000 1.10 *************** *** 27,34 **** namespace itunesdb { ! PlaylistItem::PlaylistItem( Q_UINT32 ipod_id) ! : ListItem( ITEMTYPE_PLAYLISTITEM), m_pos( PLAYLISTITEM_INVALID ) { - m_id = ipod_id; } --- 27,33 ---- namespace itunesdb { ! PlaylistItem::PlaylistItem( Q_UINT32 track_id ) ! : ListItem( ITEMTYPE_PLAYLISTITEM), m_trackid( track_id ), m_pos( PLAYLISTITEM_INVALID ) { } *************** *** 36,40 **** : ListItem( ITEMTYPE_PLAYLISTITEM), m_pos( PLAYLISTITEM_INVALID ) { ! m_id = PLAYLISTITEM_INVALID; } --- 35,39 ---- : ListItem( ITEMTYPE_PLAYLISTITEM), m_pos( PLAYLISTITEM_INVALID ) { ! m_trackid = PLAYLISTITEM_INVALID; } *************** *** 54,59 **** } Q_UINT32 PlaylistItem::getID() const { ! return m_id; } --- 53,78 ---- } + QDataStream & PlaylistItem::readFromStream( QDataStream & instream, bool * ok ) { + Q_UINT32 dummy, blocklen; + instream >> blocklen; + + // 8 bytes read + #if 0 + if ( blocklen < ) { + // insufficient information + QByteArray buffer( blocklen ); + instream.readRawBytes(buffer.data(), blocklen - 8); + + if ( ok ) { + *ok = false; + } + + return instream; + } + #endif + } + Q_UINT32 PlaylistItem::getID() const { ! return m_trackid; } Index: itunesdb.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdb.cpp,v retrieving revision 1.113 retrieving revision 1.114 diff -C2 -d -r1.113 -r1.114 *** itunesdb.cpp 14 Jan 2008 21:03:59 -0000 1.113 --- itunesdb.cpp 18 Jan 2008 22:23:16 -0000 1.114 *************** *** 360,364 **** PlaylistByIDFinder( Q_UINT64 id ) : mID( id ) { } bool operator() ( const Playlist * playlist ) const { ! return playlist->getID() == mID; } private: --- 360,364 ---- PlaylistByIDFinder( Q_UINT64 id ) : mID( id ) { } bool operator() ( const Playlist * playlist ) const { ! return playlist->getDBID() == mID; } private: *************** *** 443,447 **** ITunesDBPlaylist * result = new ITunesDBPlaylist( *this ); if ( mMaxDBID != 0 ) { // iTunesDB is open ! result->setID( getNextFreeDBID() ); } if ( !title.isEmpty() ) { --- 443,447 ---- ITunesDBPlaylist * result = new ITunesDBPlaylist( *this ); if ( mMaxDBID != 0 ) { // iTunesDB is open ! result->setDBID( getNextFreeDBID() ); } if ( !title.isEmpty() ) { *************** *** 525,534 **** // check if the DBID is available and itunesdb is open ! if ( isOpen() && getPlaylistByID( playlist->getID() ) ) { ! playlist->setID( getNextFreeDBID() ); } ! if ( mMaxDBID < playlist->getID() ) { ! mMaxDBID = playlist->getID(); } --- 525,534 ---- // check if the DBID is available and itunesdb is open ! if ( isOpen() && getPlaylistByID( playlist->getDBID() ) ) { ! playlist->setDBID( getNextFreeDBID() ); } ! if ( mMaxDBID < playlist->getDBID() ) { ! mMaxDBID = playlist->getDBID(); } Index: playlistitem.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlistitem.h,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** playlistitem.h 14 Jan 2008 21:03:58 -0000 1.15 --- playlistitem.h 18 Jan 2008 22:23:15 -0000 1.16 *************** *** 68,72 **** PlaylistItem(); ! PlaylistItem( Q_UINT32 ipod_id); /** --- 68,72 ---- PlaylistItem(); ! PlaylistItem( Q_UINT32 track_id); /** *************** *** 80,84 **** virtual bool readMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ); ! Q_UINT32 m_id; Q_UINT32 m_pos; }; --- 80,91 ---- virtual bool readMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ); ! virtual QDataStream & readFromStream( QDataStream & instream, bool * ok = NULL ); ! ! Q_UINT16 m_podcastgroupflag; ! Q_UINT16 m_unk4unk5; ! Q_UINT32 m_groupid; ! Q_UINT32 m_trackid; ! Q_UINT32 m_weirdotimestamp; ! Q_UINT32 m_groupref; Q_UINT32 m_pos; }; Index: track.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/track.cpp,v retrieving revision 1.74 retrieving revision 1.75 diff -C2 -d -r1.74 -r1.75 *** track.cpp 28 Dec 2007 11:41:40 -0000 1.74 --- track.cpp 18 Jan 2008 22:23:16 -0000 1.75 *************** *** 523,527 **** type( 0 ), compilation( 0 ), - dbid( 0 ), checked( 1 ), app_rating( 0 ), --- 523,526 ---- *************** *** 615,619 **** stream << (Q_UINT32) ( date_added ? date_added + MAC_EPOCH_DELTA : 0 ); // 0x68 stream << (Q_UINT32) 0; // bookmarktime ! stream << (Q_UINT64) dbid; // unique bit (64 bit) stream << (Q_UINT8) checked; // checked in iTunes stream << (Q_UINT8) app_rating; // application rating --- 614,618 ---- stream << (Q_UINT32) ( date_added ? date_added + MAC_EPOCH_DELTA : 0 ); // 0x68 stream << (Q_UINT32) 0; // bookmarktime ! stream << (Q_UINT64) m_dbid; // unique bit (64 bit) stream << (Q_UINT8) checked; // checked in iTunes stream << (Q_UINT8) app_rating; // application rating *************** *** 634,638 **** stream << (Q_UINT8) mRememberPbackPos; // 0xA6 0x01 if remember playback position is set stream << (Q_UINT8) flag4; // set to 1 or 2 if podcast, 0 otherwise ! stream << (Q_UINT64) dbid; // 0xA8 - same unique id as above stream << (Q_UINT8) mHasLyricsFlag; // 0xB0 - 0x01 if lyrics stored in MP3 meta tags stream << (Q_UINT8) mIsMovie; // 0xB1 - 0x01 if refers to a movie, 0x0 otherwise --- 633,637 ---- stream << (Q_UINT8) mRememberPbackPos; // 0xA6 0x01 if remember playback position is set stream << (Q_UINT8) flag4; // set to 1 or 2 if podcast, 0 otherwise ! stream << (Q_UINT64) m_dbid; // 0xA8 - same unique id as above stream << (Q_UINT8) mHasLyricsFlag; // 0xB0 - 0x01 if lyrics stored in MP3 meta tags stream << (Q_UINT8) mIsMovie; // 0xB1 - 0x01 if refers to a movie, 0x0 otherwise *************** *** 743,747 **** if ( blocklen >= 148 ) { // iTunes >= 4.7 instream >> dummy; // 108 ! instream >> dbid; // 112 instream >> checked; // 120; instream >> app_rating; // 121; --- 742,746 ---- if ( blocklen >= 148 ) { // iTunes >= 4.7 instream >> dummy; // 108 ! instream >> m_dbid; // 112 instream >> checked; // 120; instream >> app_rating; // 121; *************** *** 1030,1040 **** } - /** - */ - Q_UINT64 Track::getDBID() const - { - return dbid; - } - void Track::setAlbum( const QString& album ) { --- 1029,1032 ---- *************** *** 1145,1156 **** - /** - */ - void Track::setDBID( Q_UINT64 id ) - { - dbid = id; - } - - void Track::setComment( const QString& comment ) { setItemProperty( comment, itunesdb::MHOD_COMMENT ); --- 1137,1140 ---- Index: playlist.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlist.h,v retrieving revision 1.51 retrieving revision 1.52 diff -C2 -d -r1.51 -r1.52 *** playlist.h 14 Jan 2008 21:03:59 -0000 1.51 --- playlist.h 18 Jan 2008 22:23:15 -0000 1.52 *************** *** 200,215 **** /** - * Returns the unique DB id for this playlist - * @return the unique DB id for this playlist - */ - Q_UINT64 getID() const { return m_id; } - - /** - * Sets the unique DB id for this playlist - * @param id the unique DB id for this playlist - */ - void setID( Q_UINT64 id ); - - /** * Sorts the playlistItems by position. */ --- 200,203 ---- *************** *** 332,336 **** Q_UINT8 m_flag4; Q_UINT32 timeStamp; // some timestamp - Q_UINT64 m_id; // playlist ID Q_UINT32 unk3; Q_UINT16 mIsPodcast; // podcast flag --- 320,323 ---- Index: itunesdbwriter.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbwriter.h,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** itunesdbwriter.h 14 Jan 2008 21:04:37 -0000 1.8 --- itunesdbwriter.h 18 Jan 2008 22:23:15 -0000 1.9 *************** *** 32,35 **** --- 32,44 ---- namespace itunesdb { + enum DBFlags { + None = 0x0, + Has_Podcasts = 0x1, + Has_AlbumInfo = 0x2, + Has_CheckSum = 0x4, + Has_LetterJT = 0x8, + Has_All = 0xFFFFFFFF + }; + /** Writes an iTunesDB file *************** *** 41,54 **** class ItunesDBWriter{ public: - enum Flags { - None = 0x0, - Has_Podcasts = 0x1, - Has_AlbumInfo = 0x2, - Has_CheckSum = 0x4, - Has_LetterJT = 0x8, - Has_All = 0xFFFFFFFF - }; ! ItunesDBWriter(ItunesDBDataSource & trackdatasource); ~ItunesDBWriter(); --- 50,55 ---- class ItunesDBWriter{ public: ! ItunesDBWriter( ItunesDBDataSource & trackdatasource, int flags = Has_All ); ~ItunesDBWriter(); *************** *** 65,69 **** * @return true if the operation was successful, false otherwise */ ! bool write( QFile& file, int flags = Has_All ); /** --- 66,70 ---- * @return true if the operation was successful, false otherwise */ ! bool write( QFile& file ); /** *************** *** 74,77 **** --- 75,81 ---- private: + + int m_flags; + ItunesDBDataSource& m_datasource; Index: track.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/track.h,v retrieving revision 1.77 retrieving revision 1.78 diff -C2 -d -r1.77 -r1.78 *** track.h 28 Dec 2007 11:41:40 -0000 1.77 --- track.h 18 Jan 2008 22:23:15 -0000 1.78 *************** *** 187,196 **** /** - * Returns the DBID which refers to additional media associated to this track (like cover art) - * @return the DBID - */ - Q_UINT64 getDBID() const; - - /** * Returns the rating for this track as read from the itunesdb. * @return the rating for this track as read from the itunesdb. --- 187,190 ---- *************** *** 297,302 **** Q_UINT16 getBPM() const; - virtual void setDBID( Q_UINT64 id ); - /** * Sets the album for this track. --- 291,294 ---- *************** *** 682,686 **** unsigned char compilation; // iscompiltaion=1, 0 otherwise - Q_UINT64 dbid; Q_UINT8 checked; Q_UINT8 app_rating; --- 674,677 ---- Index: itunesdb_rw.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdb_rw.cpp,v retrieving revision 1.37 retrieving revision 1.38 diff -C2 -d -r1.37 -r1.38 *** itunesdb_rw.cpp 4 Jan 2008 21:20:24 -0000 1.37 --- itunesdb_rw.cpp 18 Jan 2008 22:23:16 -0000 1.38 *************** *** 157,163 **** virtual void handlePlaylist( Playlist * playlist ) { std::auto_ptr<Playlist> plCleanup( playlist ); ! ! // printf( "listener handling playlist %s\n", playlist->getTitle().ascii() ); ! // This has to be before the podcast check since we really need the FIRST playlist after // the track section no matter if it's in the podcast block or not --- 157,185 ---- virtual void handlePlaylist( Playlist * playlist ) { std::auto_ptr<Playlist> plCleanup( playlist ); ! #define ANALYSE_PLAYLIST_STRUCTURE ! #ifdef ANALYSE_PLAYLIST_STRUCTURE ! printf( "listener handling playlist %s in section %d with %d elements\n", ! playlist->getTitle().ascii(), ! m_currentDataSet, ! playlist->getNumTracks() ); ! Playlist * existingPL = m_itunesdb.getPlaylistByTitle( playlist->getTitle() ); ! if( existingPL ) { ! // playlist already exists ! printf( "playlist %s in section %d already exists\n", ! playlist->getTitle().ascii(), ! m_currentDataSet ); ! Playlist::Iterator iter = playlist->getElements(); ! Playlist::Iterator existingIter = existingPL->getElements(); ! while ( iter.hasNext() && existingIter.hasNext() ) { ! if ( iter.next()->getID() != existingIter.next()->getID() ) { ! printf( "\tplaylists differ at element position %d\n", ! iter.current()->getPosition() ); ! } ! } ! if ( iter.hasNext() || existingIter.hasNext() ) { ! printf( "\tplaylist differs in length\n" ); ! } ! } ! #endif // This has to be before the podcast check since we really need the FIRST playlist after // the track section no matter if it's in the podcast block or not *************** *** 178,182 **** --- 200,206 ---- // can't handle podcasts at the moment + #ifndef ANALYSE_PLAYLIST_STRUCTURE return; + #endif } *************** *** 302,308 **** for( ; playlist != m_playlists->end(); ++playlist ) { (*playlist)->doPostParsingChecks(); ! if ( (*playlist)->getID() == 0 ) { Q_UINT64 nextDBID = getNextFreeDBID(); ! (*playlist)->setID( nextDBID ); mMaxDBID = nextDBID; } --- 326,332 ---- for( ; playlist != m_playlists->end(); ++playlist ) { (*playlist)->doPostParsingChecks(); ! if ( (*playlist)->getDBID() == 0 ) { Q_UINT64 nextDBID = getNextFreeDBID(); ! (*playlist)->setDBID( nextDBID ); mMaxDBID = nextDBID; } Index: itunesdbwriter.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbwriter.cpp,v retrieving revision 1.31 retrieving revision 1.32 diff -C2 -d -r1.31 -r1.32 *** itunesdbwriter.cpp 16 Jan 2008 07:49:18 -0000 1.31 --- itunesdbwriter.cpp 18 Jan 2008 22:23:15 -0000 1.32 *************** *** 38,47 **** namespace itunesdb { ! ItunesDBWriter::ItunesDBWriter(ItunesDBDataSource & trackdatasource) : m_datasource( trackdatasource ) {} ItunesDBWriter::~ItunesDBWriter() {} #if 0 ! inline void writeMHIA( const QString& artist, const QString& album, Q_UINT32 albumID, QDataStream& datastream ) { QBuffer io_buffer; io_buffer.open(IO_WriteOnly); --- 38,48 ---- namespace itunesdb { ! ItunesDBWriter::ItunesDBWriter( ItunesDBDataSource & trackdatasource, int flags ) ! : m_flags( flags ), m_datasource( trackdatasource ) {} ItunesDBWriter::~ItunesDBWriter() {} #if 0 ! void writeMHIA( const QString& artist, const QString& album, Q_UINT32 albumID, QDataStream& datastream ) { QBuffer io_buffer; io_buffer.open(IO_WriteOnly); *************** *** 53,57 **** bufferstream << (Q_UINT32) 0x2; // number of string child records bufferstream << (Q_UINT32) albumID; // TODO ! bufferstream << (Q_UINT64) 0x0; // TODO DBID??? bufferstream << (Q_UINT32) 0x2; // TODO number of child records again??? --- 54,58 ---- bufferstream << (Q_UINT32) 0x2; // number of string child records bufferstream << (Q_UINT32) albumID; // TODO ! bufferstream << (Q_UINT64) 0x0; // TODO DBID!! bufferstream << (Q_UINT32) 0x2; // TODO number of child records again??? *************** *** 59,63 **** } ! inline void writeMHLA( QByteArray& buffer, const TrackPtrList::Iterator& tracks ) { TrackPtrList allTracks( tracks ); allTracks.sort(); --- 60,64 ---- } ! void writeMHLA( QByteArray& buffer, const TrackPtrList::Iterator& tracks ) { TrackPtrList allTracks( tracks ); allTracks.sort(); *************** *** 83,89 **** \fn itunesdb::ItunesDBWriter::write(QFile& file) */ ! bool ItunesDBWriter::write( QFile& file, int flags ) { ! if ( flags == ItunesDBWriter::None ) { return false; } --- 84,90 ---- \fn itunesdb::ItunesDBWriter::write(QFile& file) */ ! bool ItunesDBWriter::write( QFile& file ) { ! if ( m_flags == None ) { return false; } *************** *** 123,127 **** } ! if ( flags & ItunesDBWriter::Has_AlbumInfo ) { // TODO write mhla/mhia-s here } --- 124,128 ---- } ! if ( m_flags & Has_AlbumInfo ) { // TODO write mhla/mhia-s here } *************** *** 286,295 **** uint m_trackCount; uint * m_indices; public: ! MasterPlaylist( itunesdb::TrackPtrList & allTracks ) : itunesdb::Playlist(), m_trackPtrList( allTracks ), m_trackCount( allTracks.count() ), ! m_indices( new uint [ m_trackCount ] ) { TrackPtrList::Iterator trackIter = m_trackPtrList.iterator(); --- 287,298 ---- uint m_trackCount; uint * m_indices; + bool m_writeMHOD53; public: ! MasterPlaylist( itunesdb::TrackPtrList & allTracks, bool writeMHOD53 ) : itunesdb::Playlist(), m_trackPtrList( allTracks ), m_trackCount( allTracks.count() ), ! m_indices( new uint [ m_trackCount ] ), ! m_writeMHOD53( writeMHOD53 ) { TrackPtrList::Iterator trackIter = m_trackPtrList.iterator(); *************** *** 328,342 **** QChar letter; Q_UINT32 startidx; ! Q_UINT32 lastseen; MHOD53entry() : letter(), startidx( 0 ), lastseen( -1 ) {} }; ! void writeMHOD53( QDataStream& stream, uint sortIndex ) const { // write MHOD 53 ! typedef std::vector<MHOD53entry> EntryList; ! EntryList entrylist; MHOD53entry entry; - entry.letter = '0'; - MHOD53entry tailDigitEntry; tailDigitEntry.letter = '0'; --- 331,354 ---- QChar letter; Q_UINT32 startidx; ! int lastseen; MHOD53entry() : letter(), startidx( 0 ), lastseen( -1 ) {} + MHOD53entry( const QChar& newletter, unsigned int idx ) : + letter( newletter ), startidx( idx ), lastseen( idx ) {} + bool operator< ( const MHOD53entry& other ) const { return startidx < other.startidx; } }; ! typedef std::vector<MHOD53entry> MHOD53EntryList; ! unsigned int writeMHOD53( QDataStream& stream, uint sortIndex ) const { ! if ( !m_writeMHOD53 ) { ! return 0; ! } ! // write MHOD 53 ! MHOD53EntryList entrylist; ! MHOD53entry entry; MHOD53entry tailDigitEntry; + + // start and end may be non-letters + entry.letter = '0'; tailDigitEntry.letter = '0'; *************** *** 366,370 **** default: // do nothing ! return; } property = property.left( 1 ).lower(); --- 378,382 ---- default: // do nothing ! return 0; } property = property.left( 1 ).lower(); *************** *** 374,390 **** // property starts with a letter (a-z) if ( !entry.letter.isLetter() || property.localeAwareCompare( entry.letter ) > 0 ) { ! if ( i ) { // ignore letter jump at 0 entrylist.push_back( entry ); } ! entry.letter = property.at( 0 ); ! entry.startidx = i; ! entry.lastseen = i; } ! tailDigitEntry.startidx = 0; } else { // property starts with something else if ( entry.letter.isLetter() ) { ! // where already passed the "something else" section ! if ( !tailDigitEntry.startidx ) { tailDigitEntry.startidx = i; } --- 386,407 ---- // property starts with a letter (a-z) if ( !entry.letter.isLetter() || property.localeAwareCompare( entry.letter ) > 0 ) { ! if ( entry.lastseen >= 0 ) { // happens sometimes at 0 entrylist.push_back( entry ); } ! entry = MHOD53entry( newletter, i ); } ! tailDigitEntry.lastseen = -1; ! ! } else if ( newletter.isNull() && !entry.letter.isNull() ) { ! if ( entry.lastseen >= 0 ) { // happens sometimes at 0 ! entrylist.push_back( entry ); ! } ! entry = MHOD53entry( newletter, i ); ! } else { // property starts with something else if ( entry.letter.isLetter() ) { ! // we've already passed the "something else" section ! if ( tailDigitEntry.lastseen == -1 ) { tailDigitEntry.startidx = i; } *************** *** 394,404 **** entry.lastseen = i; } ! if ( entry.startidx ) { entrylist.push_back( entry ); } ! if ( tailDigitEntry.startidx ) { entrylist.push_back( tailDigitEntry ); } // write the MHOD stream << (Q_UINT32) 0x646F686D; // mhod --- 411,423 ---- entry.lastseen = i; } ! if ( entry.lastseen > 0 ) { entrylist.push_back( entry ); } ! if ( tailDigitEntry.lastseen > 0 ) { entrylist.push_back( tailDigitEntry ); } + std::sort( entrylist.begin(), entrylist.end() ); + // write the MHOD stream << (Q_UINT32) 0x646F686D; // mhod *************** *** 412,430 **** stream << (Q_UINT64) 0; ! EntryList::iterator entryIter = entrylist.begin(); for ( ; entryIter != entrylist.end(); ++entryIter ) { if ( entryIter->letter.isNull() ) { stream << (Q_UINT32) 0; } else { stream << (Q_UINT32) entryIter->letter.upper().unicode(); } stream << (Q_UINT32) entryIter->startidx; stream << (Q_UINT32) ( entryIter->lastseen - entryIter->startidx + 1 ); - // printf( "" ); } } ! void writeMHOD52( QDataStream& stream, uint sortIndex, const TrackComparatorPtr& comparator ) const { stream << (Q_UINT32) 0x646F686D; // mhod stream << (Q_UINT32) 0x18; // headerlen --- 431,469 ---- stream << (Q_UINT64) 0; ! MHOD53EntryList::iterator entryIter = entrylist.begin(); for ( ; entryIter != entrylist.end(); ++entryIter ) { + + if ( entryIter + 1 != entrylist.end() ) { + // check for overlaps + MHOD53entry& nextentry = *(entryIter + 1); + if ( entryIter->lastseen >= (int)nextentry.startidx ) { + entryIter->lastseen = nextentry.startidx - 1; + // printf( "overlap!\n" ); + } + } + if ( entryIter->letter.isNull() ) { stream << (Q_UINT32) 0; + #if 0 + printf( "written MHOD53 entry (null)[%d,%d]\n", + entryIter->startidx, entryIter->lastseen ); + #endif } else { stream << (Q_UINT32) entryIter->letter.upper().unicode(); + #if 0 + printf( "written MHOD53 entry %c[%d,%d]\n", entryIter->letter.upper().latin1(), + entryIter->startidx, entryIter->lastseen ); + #endif } + stream << (Q_UINT32) entryIter->startidx; stream << (Q_UINT32) ( entryIter->lastseen - entryIter->startidx + 1 ); } + + return 1; } ! unsigned int writeMHOD52( QDataStream& stream, uint sortIndex, const TrackComparatorPtr& comparator ) const { stream << (Q_UINT32) 0x646F686D; // mhod stream << (Q_UINT32) 0x18; // headerlen *************** *** 445,464 **** stream << (Q_UINT32) m_indices[ i ]; } } ! virtual uint writeNonStringMHODs( QDataStream& outstream ) const { ! // write type52 MHODs ! writeMHOD52( outstream, 0x03, TrackComparators::BY_TITLE ); ! writeMHOD53( outstream, 0x03 ); ! writeMHOD52( outstream, 0x05, TrackComparators::BY_ARTIST ); ! writeMHOD53( outstream, 0x05 ); ! writeMHOD52( outstream, 0x04, TrackComparators::BY_ALBUM ); ! writeMHOD53( outstream, 0x04 ); ! writeMHOD52( outstream, 0x07, TrackComparators::BY_GENRE ); ! writeMHOD53( outstream, 0x07 ); ! writeMHOD52( outstream, 0x12, TrackComparators::BY_COMPOSER ); ! writeMHOD53( outstream, 0x12 ); // writeMHOD52( outstream, 0x1D, TrackComparators::BY_TVSHOW ); --- 484,505 ---- stream << (Q_UINT32) m_indices[ i ]; } + + return 1; } ! virtual unsigned int writeNonStringMHODs( QDataStream& outstream ) const { ! unsigned int numMHOD = 0; // write type52 MHODs ! numMHOD += writeMHOD52( outstream, 0x03, TrackComparators::BY_TITLE ); ! numMHOD += writeMHOD53( outstream, 0x03 ); ! numMHOD += writeMHOD52( outstream, 0x05, TrackComparators::BY_ARTIST ); ! numMHOD += writeMHOD53( outstream, 0x05 ); ! numMHOD += writeMHOD52( outstream, 0x04, TrackComparators::BY_ALBUM ); ! numMHOD += writeMHOD53( outstream, 0x04 ); ! numMHOD += writeMHOD52( outstream, 0x07, TrackComparators::BY_GENRE ); ! numMHOD += writeMHOD53( outstream, 0x07 ); ! numMHOD += writeMHOD52( outstream, 0x12, TrackComparators::BY_COMPOSER ); ! numMHOD += writeMHOD53( outstream, 0x12 ); // writeMHOD52( outstream, 0x1D, TrackComparators::BY_TVSHOW ); *************** *** 466,473 **** // writeMHOD52( outstream, 0x1F, TrackComparators::BY_EPISODE ); ! writeMHOD52( outstream, 0x23, TrackComparators::BY_ALBUMARTIST ); ! writeMHOD52( outstream, 0x24, TrackComparators::BY_ARTISTFIELD ); ! return 12; } }; --- 507,514 ---- // writeMHOD52( outstream, 0x1F, TrackComparators::BY_EPISODE ); ! numMHOD += writeMHOD52( outstream, 0x23, TrackComparators::BY_ALBUMARTIST ); ! numMHOD += writeMHOD52( outstream, 0x24, TrackComparators::BY_ARTISTFIELD ); ! return numMHOD; } }; *************** *** 483,487 **** stream.setByteOrder( QDataStream::LittleEndian); ! MasterPlaylist masterlist( m_datasource.getTrackList() ); masterlist.setTitle( m_datasource.getTitle() ); --- 524,528 ---- stream.setByteOrder( QDataStream::LittleEndian); ! MasterPlaylist masterlist( m_datasource.getTrackList(), m_flags & Has_LetterJT ); masterlist.setTitle( m_datasource.getTitle() ); |
From: Michael S. <fr...@us...> - 2008-01-16 07:49:17
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv25396/src Modified Files: itunesdbwriter.cpp Log Message: MHOD53 fixes for strange sort behaviour Index: itunesdbwriter.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbwriter.cpp,v retrieving revision 1.30 retrieving revision 1.31 diff -C2 -d -r1.30 -r1.31 *** itunesdbwriter.cpp 15 Jan 2008 02:34:52 -0000 1.30 --- itunesdbwriter.cpp 16 Jan 2008 07:49:18 -0000 1.31 *************** *** 328,333 **** QChar letter; Q_UINT32 startidx; ! Q_UINT32 count; ! MHOD53entry() : letter(), startidx( 0 ), count( 0 ) {} }; void writeMHOD53( QDataStream& stream, uint sortIndex ) const { --- 328,333 ---- QChar letter; Q_UINT32 startidx; ! Q_UINT32 lastseen; ! MHOD53entry() : letter(), startidx( 0 ), lastseen( -1 ) {} }; void writeMHOD53( QDataStream& stream, uint sortIndex ) const { *************** *** 337,340 **** --- 337,344 ---- MHOD53entry entry; entry.letter = '0'; + + MHOD53entry tailDigitEntry; + tailDigitEntry.letter = '0'; + for ( uint i = 0; i < m_trackCount; i++ ) { Track * track = m_trackPtrList[ m_indices[ i ] ]; *************** *** 367,384 **** QChar newletter = property.at( 0 ); ! if ( ( entry.letter.isLetter() xor newletter.isLetter() ) || ! ( entry.letter.isLetter() && property.localeAwareCompare( entry.letter ) > 0 ) ) ! { ! if ( i ) { // ignore letter jump at 0 ! entry.count = i - entry.startidx; ! entrylist.push_back( entry ); } - entry.letter = property.at( 0 ); - entry.startidx = i; } } ! entry.count = m_trackCount - entry.startidx; ! entrylist.push_back( entry ); ! // write the MHOD stream << (Q_UINT32) 0x646F686D; // mhod --- 371,404 ---- QChar newletter = property.at( 0 ); ! if ( newletter.isLetter() ) { ! // property starts with a letter (a-z) ! if ( !entry.letter.isLetter() || property.localeAwareCompare( entry.letter ) > 0 ) { ! if ( i ) { // ignore letter jump at 0 ! entrylist.push_back( entry ); ! } ! entry.letter = property.at( 0 ); ! entry.startidx = i; ! entry.lastseen = i; ! } ! tailDigitEntry.startidx = 0; ! } else { ! // property starts with something else ! if ( entry.letter.isLetter() ) { ! // where already passed the "something else" section ! if ( !tailDigitEntry.startidx ) { ! tailDigitEntry.startidx = i; ! } ! tailDigitEntry.lastseen = i; } } + entry.lastseen = i; } ! if ( entry.startidx ) { ! entrylist.push_back( entry ); ! } ! if ( tailDigitEntry.startidx ) { ! entrylist.push_back( tailDigitEntry ); ! } ! // write the MHOD stream << (Q_UINT32) 0x646F686D; // mhod *************** *** 400,404 **** } stream << (Q_UINT32) entryIter->startidx; ! stream << (Q_UINT32) entryIter->count; } } --- 420,425 ---- } stream << (Q_UINT32) entryIter->startidx; ! stream << (Q_UINT32) ( entryIter->lastseen - entryIter->startidx + 1 ); ! // printf( "" ); } } |
From: Michael S. <fr...@us...> - 2008-01-15 02:34:50
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv23971/src Modified Files: itunesdbwriter.cpp Log Message: technically fixed writing MHOD53 Index: itunesdbwriter.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbwriter.cpp,v retrieving revision 1.29 retrieving revision 1.30 diff -C2 -d -r1.29 -r1.30 *** itunesdbwriter.cpp 14 Jan 2008 22:15:05 -0000 1.29 --- itunesdbwriter.cpp 15 Jan 2008 02:34:52 -0000 1.30 *************** *** 384,393 **** stream << (Q_UINT32) 0x646F686D; // mhod stream << (Q_UINT32) 0x18; // headerlen ! stream << (Q_UINT32) 40 + ( 12 * m_trackCount ); // complete size stream << (Q_UINT32) 53; stream << (Q_UINT32) 0; stream << (Q_UINT32) 0; stream << (Q_UINT32) sortIndex; ! stream << (Q_UINT32) m_trackCount; stream << (Q_UINT64) 0; --- 384,393 ---- stream << (Q_UINT32) 0x646F686D; // mhod stream << (Q_UINT32) 0x18; // headerlen ! stream << (Q_UINT32) ( 40 + ( 12 * entrylist.size() ) ); // complete size stream << (Q_UINT32) 53; stream << (Q_UINT32) 0; stream << (Q_UINT32) 0; stream << (Q_UINT32) sortIndex; ! stream << (Q_UINT32) entrylist.size(); stream << (Q_UINT64) 0; *************** *** 408,412 **** stream << (Q_UINT32) 0x646F686D; // mhod stream << (Q_UINT32) 0x18; // headerlen ! stream << (Q_UINT32) 72 + ( 4 * m_trackCount ); // complete size stream << (Q_UINT32) 52; stream << (Q_UINT32) 0; --- 408,412 ---- stream << (Q_UINT32) 0x646F686D; // mhod stream << (Q_UINT32) 0x18; // headerlen ! stream << (Q_UINT32) ( 72 + ( 4 * m_trackCount ) ); // complete size stream << (Q_UINT32) 52; stream << (Q_UINT32) 0; *************** *** 431,443 **** // write type52 MHODs writeMHOD52( outstream, 0x03, TrackComparators::BY_TITLE ); ! // writeMHOD53( outstream, 0x03 ); writeMHOD52( outstream, 0x05, TrackComparators::BY_ARTIST ); ! // writeMHOD53( outstream, 0x05 ); writeMHOD52( outstream, 0x04, TrackComparators::BY_ALBUM ); ! // writeMHOD53( outstream, 0x04 ); writeMHOD52( outstream, 0x07, TrackComparators::BY_GENRE ); ! // writeMHOD53( outstream, 0x07 ); writeMHOD52( outstream, 0x12, TrackComparators::BY_COMPOSER ); ! // writeMHOD53( outstream, 0x12 ); // writeMHOD52( outstream, 0x1D, TrackComparators::BY_TVSHOW ); --- 431,443 ---- // write type52 MHODs writeMHOD52( outstream, 0x03, TrackComparators::BY_TITLE ); ! writeMHOD53( outstream, 0x03 ); writeMHOD52( outstream, 0x05, TrackComparators::BY_ARTIST ); ! writeMHOD53( outstream, 0x05 ); writeMHOD52( outstream, 0x04, TrackComparators::BY_ALBUM ); ! writeMHOD53( outstream, 0x04 ); writeMHOD52( outstream, 0x07, TrackComparators::BY_GENRE ); ! writeMHOD53( outstream, 0x07 ); writeMHOD52( outstream, 0x12, TrackComparators::BY_COMPOSER ); ! writeMHOD53( outstream, 0x12 ); // writeMHOD52( outstream, 0x1D, TrackComparators::BY_TVSHOW ); *************** *** 448,452 **** writeMHOD52( outstream, 0x24, TrackComparators::BY_ARTISTFIELD ); ! return 7; } }; --- 448,452 ---- writeMHOD52( outstream, 0x24, TrackComparators::BY_ARTISTFIELD ); ! return 12; } }; |
From: Michael S. <fr...@us...> - 2008-01-14 22:15:04
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv16033/src Modified Files: itunesdbwriter.cpp Log Message: removed irritating comment Index: itunesdbwriter.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbwriter.cpp,v retrieving revision 1.28 retrieving revision 1.29 diff -C2 -d -r1.28 -r1.29 *** itunesdbwriter.cpp 14 Jan 2008 21:04:37 -0000 1.28 --- itunesdbwriter.cpp 14 Jan 2008 22:15:05 -0000 1.29 *************** *** 431,443 **** // write type52 MHODs writeMHOD52( outstream, 0x03, TrackComparators::BY_TITLE ); ! writeMHOD53( outstream, 0x03 ); writeMHOD52( outstream, 0x05, TrackComparators::BY_ARTIST ); ! writeMHOD53( outstream, 0x05 ); writeMHOD52( outstream, 0x04, TrackComparators::BY_ALBUM ); ! writeMHOD53( outstream, 0x04 ); writeMHOD52( outstream, 0x07, TrackComparators::BY_GENRE ); ! writeMHOD53( outstream, 0x07 ); writeMHOD52( outstream, 0x12, TrackComparators::BY_COMPOSER ); ! writeMHOD53( outstream, 0x12 ); // writeMHOD52( outstream, 0x1D, TrackComparators::BY_TVSHOW ); --- 431,443 ---- // write type52 MHODs writeMHOD52( outstream, 0x03, TrackComparators::BY_TITLE ); ! // writeMHOD53( outstream, 0x03 ); writeMHOD52( outstream, 0x05, TrackComparators::BY_ARTIST ); ! // writeMHOD53( outstream, 0x05 ); writeMHOD52( outstream, 0x04, TrackComparators::BY_ALBUM ); ! // writeMHOD53( outstream, 0x04 ); writeMHOD52( outstream, 0x07, TrackComparators::BY_GENRE ); ! // writeMHOD53( outstream, 0x07 ); writeMHOD52( outstream, 0x12, TrackComparators::BY_COMPOSER ); ! // writeMHOD53( outstream, 0x12 ); // writeMHOD52( outstream, 0x1D, TrackComparators::BY_TVSHOW ); *************** *** 445,449 **** // writeMHOD52( outstream, 0x1F, TrackComparators::BY_EPISODE ); - // TODO check why this doesn't work writeMHOD52( outstream, 0x23, TrackComparators::BY_ALBUMARTIST ); writeMHOD52( outstream, 0x24, TrackComparators::BY_ARTISTFIELD ); --- 445,448 ---- |
From: Michael S. <fr...@us...> - 2008-01-14 21:04:34
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv19340/src Modified Files: itunesdbwriter.h itunesdbwriter.cpp Log Message: writing mhod53 Index: itunesdbwriter.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbwriter.cpp,v retrieving revision 1.27 retrieving revision 1.28 diff -C2 -d -r1.27 -r1.28 *** itunesdbwriter.cpp 12 Jan 2008 15:05:33 -0000 1.27 --- itunesdbwriter.cpp 14 Jan 2008 21:04:37 -0000 1.28 *************** *** 334,340 **** // write MHOD 53 typedef std::vector<MHOD53entry> EntryList; ! printf( "writing MHOD53 sorted by 0x0%x\n", sortIndex ); ! EntryList entrylist( 26 ); MHOD53entry entry; for ( uint i = 0; i < m_trackCount; i++ ) { Track * track = m_trackPtrList[ m_indices[ i ] ]; --- 334,340 ---- // write MHOD 53 typedef std::vector<MHOD53entry> EntryList; ! EntryList entrylist; MHOD53entry entry; + entry.letter = '0'; for ( uint i = 0; i < m_trackCount; i++ ) { Track * track = m_trackPtrList[ m_indices[ i ] ]; *************** *** 360,383 **** property = track->getComposer(); break; - case 0x23: - property = track->getAlbumArtist(); - break; - case 0x24: - property = track->getArtist(); - break; default: // do nothing return; } - // printf( "%s\n", property.ascii() ); property = property.left( 1 ).lower(); ! if ( property.localeAwareCompare( entry.letter.lower() ) > 0 ) { ! QChar newletter = property.at( 0 ); ! if ( !entry.letter.isNull() ) { ! printf( "letter jump for %s\n", property.ascii() ); entry.count = i - entry.startidx; entrylist.push_back( entry ); } ! entry.letter = newletter.upper(); entry.startidx = i; } --- 360,378 ---- property = track->getComposer(); break; default: // do nothing return; } property = property.left( 1 ).lower(); ! QChar newletter = property.at( 0 ); ! ! if ( ( entry.letter.isLetter() xor newletter.isLetter() ) || ! ( entry.letter.isLetter() && property.localeAwareCompare( entry.letter ) > 0 ) ) ! { ! if ( i ) { // ignore letter jump at 0 entry.count = i - entry.startidx; entrylist.push_back( entry ); } ! entry.letter = property.at( 0 ); entry.startidx = i; } *************** *** 385,392 **** entry.count = m_trackCount - entry.startidx; entrylist.push_back( entry ); EntryList::iterator entryIter = entrylist.begin(); for ( ; entryIter != entrylist.end(); ++entryIter ) { ! printf( "letter %c starts at %d with %d entries\n", entryIter->letter.latin1(), entryIter->startidx, entryIter->count ); } } --- 380,404 ---- entry.count = m_trackCount - entry.startidx; entrylist.push_back( entry ); + + // write the MHOD + stream << (Q_UINT32) 0x646F686D; // mhod + stream << (Q_UINT32) 0x18; // headerlen + stream << (Q_UINT32) 40 + ( 12 * m_trackCount ); // complete size + stream << (Q_UINT32) 53; + stream << (Q_UINT32) 0; + stream << (Q_UINT32) 0; + stream << (Q_UINT32) sortIndex; + stream << (Q_UINT32) m_trackCount; + stream << (Q_UINT64) 0; EntryList::iterator entryIter = entrylist.begin(); for ( ; entryIter != entrylist.end(); ++entryIter ) { ! if ( entryIter->letter.isNull() ) { ! stream << (Q_UINT32) 0; ! } else { ! stream << (Q_UINT32) entryIter->letter.upper().unicode(); ! } ! stream << (Q_UINT32) entryIter->startidx; ! stream << (Q_UINT32) entryIter->count; } } *************** *** 419,436 **** // write type52 MHODs writeMHOD52( outstream, 0x03, TrackComparators::BY_TITLE ); ! // writeMHOD53( outstream, 0x03 ); ! writeMHOD52( outstream, 0x04, TrackComparators::BY_ALBUM ); ! // writeMHOD53( outstream, 0x04 ); writeMHOD52( outstream, 0x05, TrackComparators::BY_ARTIST ); ! // writeMHOD53( outstream, 0x05 ); writeMHOD52( outstream, 0x07, TrackComparators::BY_GENRE ); ! // writeMHOD53( outstream, 0x07 ); writeMHOD52( outstream, 0x12, TrackComparators::BY_COMPOSER ); ! // writeMHOD53( outstream, 0x12 ); // writeMHOD52( outstream, 0x1D, TrackComparators::BY_TVSHOW ); // writeMHOD52( outstream, 0x1E, TrackComparators::BY_SEASON ); // writeMHOD52( outstream, 0x1F, TrackComparators::BY_EPISODE ); - // TODO check why this doesn't work --- 431,447 ---- // write type52 MHODs writeMHOD52( outstream, 0x03, TrackComparators::BY_TITLE ); ! writeMHOD53( outstream, 0x03 ); writeMHOD52( outstream, 0x05, TrackComparators::BY_ARTIST ); ! writeMHOD53( outstream, 0x05 ); ! writeMHOD52( outstream, 0x04, TrackComparators::BY_ALBUM ); ! writeMHOD53( outstream, 0x04 ); writeMHOD52( outstream, 0x07, TrackComparators::BY_GENRE ); ! writeMHOD53( outstream, 0x07 ); writeMHOD52( outstream, 0x12, TrackComparators::BY_COMPOSER ); ! writeMHOD53( outstream, 0x12 ); // writeMHOD52( outstream, 0x1D, TrackComparators::BY_TVSHOW ); // writeMHOD52( outstream, 0x1E, TrackComparators::BY_SEASON ); // writeMHOD52( outstream, 0x1F, TrackComparators::BY_EPISODE ); // TODO check why this doesn't work Index: itunesdbwriter.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbwriter.h,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** itunesdbwriter.h 12 Jan 2008 15:05:33 -0000 1.7 --- itunesdbwriter.h 14 Jan 2008 21:04:37 -0000 1.8 *************** *** 46,49 **** --- 46,50 ---- Has_AlbumInfo = 0x2, Has_CheckSum = 0x4, + Has_LetterJT = 0x8, Has_All = 0xFFFFFFFF }; |
From: Michael S. <fr...@us...> - 2008-01-14 21:04:02
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv18946/src Modified Files: playlistitem.h playlistitem.cpp itunesdb.h listitem.cpp playlist.h playlist.cpp itunesdb.cpp itunesdbparser.cpp listitem.h Log Message: return bool now for mhod reading methods in listitem Index: listitem.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/listitem.cpp,v retrieving revision 1.29 retrieving revision 1.30 diff -C2 -d -r1.29 -r1.30 *** listitem.cpp 4 Jan 2008 21:20:21 -0000 1.29 --- listitem.cpp 14 Jan 2008 21:03:59 -0000 1.30 *************** *** 49,56 **** case MHOD_DESCRIPTION_TEXT: case MHOD_SUBTITLE: ! // TODO check for these with the libqpod impl ! // case MHOD_TVSHOW: ! // case MHOD_TVEPISODE: ! // case MHOD_TVNETWORK: case MHOD_ALBUMARTIST: case MHOD_ARTIST_FOR_SORT: --- 49,55 ---- case MHOD_DESCRIPTION_TEXT: case MHOD_SUBTITLE: ! case MHOD_TVSHOW: ! case MHOD_TVEPISODE: ! case MHOD_TVNETWORK: case MHOD_ALBUMARTIST: case MHOD_ARTIST_FOR_SORT: *************** *** 158,162 **** ! void ListItem::readNonStringMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ) { // dump the whole mhod uint numBytes = blocklen - 16; --- 157,161 ---- ! bool ListItem::readNonStringMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ) { // dump the whole mhod uint numBytes = blocklen - 16; *************** *** 164,171 **** stream.readRawBytes( buffer.data(), numBytes ); m_dumpedMHODs.push_back( MHODPair( type, buffer ) ); } ! void ListItem::readMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ) { switch ( type ) { case MHOD_TITLE: --- 163,175 ---- stream.readRawBytes( buffer.data(), numBytes ); m_dumpedMHODs.push_back( MHODPair( type, buffer ) ); + + return true; } ! bool ListItem::readMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ) { ! if ( blocklen > 0x1FFFFFFF ) { ! return false; ! } switch ( type ) { case MHOD_TITLE: *************** *** 182,189 **** case MHOD_DESCRIPTION_TEXT: case MHOD_SUBTITLE: ! // TODO check for these with the libqpod impl ! // case MHOD_TVSHOW: ! // case MHOD_TVEPISODE: ! // case MHOD_TVNETWORK: case MHOD_ALBUMARTIST: case MHOD_ARTIST_FOR_SORT: --- 186,192 ---- case MHOD_DESCRIPTION_TEXT: case MHOD_SUBTITLE: ! case MHOD_TVSHOW: ! case MHOD_TVEPISODE: ! case MHOD_TVNETWORK: case MHOD_ALBUMARTIST: case MHOD_ARTIST_FOR_SORT: *************** *** 194,199 **** case MHOD_COMPOSER_FOR_SORT: case MHOD_ALBUMINFO_TITLE: ! case MHOD_ALBUMINFO_ARTIST: ! { uint ucs2len = ( blocklen - 40 ) / sizeof( Q_UINT16 ); Q_UINT16 * buffer = new Q_UINT16 [ ucs2len + 1 ]; --- 197,205 ---- case MHOD_COMPOSER_FOR_SORT: case MHOD_ALBUMINFO_TITLE: ! case MHOD_ALBUMINFO_ARTIST: { ! if ( blocklen <= 40 ) { ! itunesdb::utils::seekRelative( stream, blocklen - 16 ); ! break; ! } uint ucs2len = ( blocklen - 40 ) / sizeof( Q_UINT16 ); Q_UINT16 * buffer = new Q_UINT16 [ ucs2len + 1 ]; *************** *** 212,215 **** --- 218,225 ---- case MHOD_PODCAST_ENCLOSURE_URL: case MHOD_PODCAST_RSS_URL: { + if ( blocklen <= 24 ) { + itunesdb::utils::seekRelative( stream, blocklen - 16 ); + break; + } uint numBytes = blocklen - 24; char * buffer = new char [ numBytes + 1 ]; *************** *** 235,238 **** --- 245,250 ---- break; // ignore } + + return true; } Index: playlist.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlist.cpp,v retrieving revision 1.67 retrieving revision 1.68 diff -C2 -d -r1.67 -r1.68 *** playlist.cpp 12 Jan 2008 15:04:24 -0000 1.67 --- playlist.cpp 14 Jan 2008 21:03:59 -0000 1.68 *************** *** 329,333 **** ! void Playlist::readNonStringMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ) { switch ( type ) { case MHOD_SMART_PLAYLIST_INFO: { --- 329,333 ---- ! bool Playlist::readNonStringMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ) { switch ( type ) { case MHOD_SMART_PLAYLIST_INFO: { *************** *** 336,340 **** ruleSet.readHeader( stream, blocklen - 24 ); } ! break; case MHOD_SMART_PLAYLIST_IRULES: { SmartPlaylistRuleSet& ruleSet = enableSmartPlaylist(); --- 336,340 ---- ruleSet.readHeader( stream, blocklen - 24 ); } ! return true; case MHOD_SMART_PLAYLIST_IRULES: { SmartPlaylistRuleSet& ruleSet = enableSmartPlaylist(); *************** *** 344,350 **** stream.setByteOrder( QDataStream::LittleEndian ); } ! break; default: ! ListItem::readNonStringMHOD( stream, type, blocklen ); } } --- 344,350 ---- stream.setByteOrder( QDataStream::LittleEndian ); } ! return true; default: ! return ListItem::readNonStringMHOD( stream, type, blocklen ); } } Index: listitem.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/listitem.h,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** listitem.h 4 Jan 2008 21:20:21 -0000 1.25 --- listitem.h 14 Jan 2008 21:03:59 -0000 1.26 *************** *** 168,175 **** const QByteArray * getDumpedMHOD( Q_UINT32 type ) const; ! virtual void readMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ); Q_UINT32 writeMHODsToStream ( QDataStream & outstream ) const; ! virtual void readNonStringMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ); virtual uint writeNonStringMHODs( QDataStream& outstream ) const; --- 168,175 ---- const QByteArray * getDumpedMHOD( Q_UINT32 type ) const; ! virtual bool readMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ); Q_UINT32 writeMHODsToStream ( QDataStream & outstream ) const; ! virtual bool readNonStringMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ); virtual uint writeNonStringMHODs( QDataStream& outstream ) const; Index: playlistitem.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlistitem.cpp,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** playlistitem.cpp 25 Jul 2006 22:44:58 -0000 1.8 --- playlistitem.cpp 14 Jan 2008 21:03:59 -0000 1.9 *************** *** 42,46 **** } ! void PlaylistItem::readMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ) { switch ( type ) { case MHOD_PLAYLIST: --- 42,46 ---- } ! bool PlaylistItem::readMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ) { switch ( type ) { case MHOD_PLAYLIST: *************** *** 48,55 **** stream >> m_pos; itunesdb::utils::seekRelative( stream, blocklen - 28 ); ! break; default: ! ListItem::readMHOD( stream, type, blocklen ); ! break; } } --- 48,54 ---- stream >> m_pos; itunesdb::utils::seekRelative( stream, blocklen - 28 ); ! return true; default: ! return ListItem::readMHOD( stream, type, blocklen ); } } Index: itunesdb.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdb.cpp,v retrieving revision 1.112 retrieving revision 1.113 diff -C2 -d -r1.112 -r1.113 *** itunesdb.cpp 28 Dec 2007 11:39:17 -0000 1.112 --- itunesdb.cpp 14 Jan 2008 21:03:59 -0000 1.113 *************** *** 182,186 **** ! void ITunesDBPlaylist::readNonStringMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ) { switch( type ) { case MHOD_LIBRARY_PLAYLIST_INDEX: --- 182,186 ---- ! bool ITunesDBPlaylist::readNonStringMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ) { switch( type ) { case MHOD_LIBRARY_PLAYLIST_INDEX: *************** *** 211,217 **** itunesdb::utils::seekRelative( stream, blocklen - 16 ); // skip the whole block #endif ! break; // ignore default: ! Playlist::readNonStringMHOD( stream, type, blocklen ); } } --- 211,217 ---- itunesdb::utils::seekRelative( stream, blocklen - 16 ); // skip the whole block #endif ! return true; // ignore default: ! return Playlist::readNonStringMHOD( stream, type, blocklen ); } } Index: playlistitem.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlistitem.h,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** playlistitem.h 24 Nov 2007 21:26:34 -0000 1.14 --- playlistitem.h 14 Jan 2008 21:03:58 -0000 1.15 *************** *** 78,82 **** * Reads the playlist order MHODs */ ! virtual void readMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ); Q_UINT32 m_id; --- 78,82 ---- * Reads the playlist order MHODs */ ! virtual bool readMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ); Q_UINT32 m_id; Index: playlist.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlist.h,v retrieving revision 1.50 retrieving revision 1.51 diff -C2 -d -r1.50 -r1.51 *** playlist.h 26 Nov 2007 20:30:50 -0000 1.50 --- playlist.h 14 Jan 2008 21:03:59 -0000 1.51 *************** *** 318,322 **** void fillSplRulesBuffer( QByteArray& buffer ) const; ! virtual void readNonStringMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ); virtual uint writeNonStringMHODs( QDataStream& outstream ) const; --- 318,322 ---- void fillSplRulesBuffer( QByteArray& buffer ) const; ! virtual bool readNonStringMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ); virtual uint writeNonStringMHODs( QDataStream& outstream ) const; Index: itunesdb.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdb.h,v retrieving revision 1.84 retrieving revision 1.85 diff -C2 -d -r1.84 -r1.85 *** itunesdb.h 28 Dec 2007 11:39:17 -0000 1.84 --- itunesdb.h 14 Jan 2008 21:03:59 -0000 1.85 *************** *** 234,238 **** * reads mhods with type above type 15 (mhods not containing strings) */ ! virtual void readNonStringMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ); virtual void setDirty( bool dirtyFlag = true ); --- 234,238 ---- * reads mhods with type above type 15 (mhods not containing strings) */ ! virtual bool readNonStringMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ); virtual void setDirty( bool dirtyFlag = true ); Index: itunesdbparser.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbparser.cpp,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** itunesdbparser.cpp 4 Jan 2008 21:20:21 -0000 1.20 --- itunesdbparser.cpp 14 Jan 2008 21:03:59 -0000 1.21 *************** *** 165,169 **** stream >> type; if ( listitem != NULL ) { ! listitem->readMHOD( stream, type, blocklen ); } else { itunesdb::utils::seekRelative( stream, blocklen - 16 ); --- 165,177 ---- stream >> type; if ( listitem != NULL ) { ! if ( !listitem->readMHOD( stream, type, blocklen ) ) { ! QString msg( "could not parse mhod data element at position %1 ! stop parsing" ); ! listener->handleError( msg.arg( file.at() ) ); ! delete current_playlist; ! delete current_playlistitem; ! delete current_track; ! current_playlist = NULL; ! return; ! } } else { itunesdb::utils::seekRelative( stream, blocklen - 16 ); *************** *** 246,259 **** QString msg( "unknown tag %1 found at position %2 ! stop parsing" ); listener->handleError( msg.arg( blocktype, 0, 16 ).arg( file.at() ) ); - delete current_playlist; - current_playlist = NULL; - delete current_playlistitem; - current_playlistitem = NULL; - delete current_track; ! current_track = NULL; ! } --- 254,261 ---- QString msg( "unknown tag %1 found at position %2 ! stop parsing" ); listener->handleError( msg.arg( blocktype, 0, 16 ).arg( file.at() ) ); delete current_playlist; delete current_playlistitem; delete current_track; ! current_playlist = NULL; } *************** *** 367,370 **** --- 369,373 ---- } + } |
From: Michael S. <fr...@us...> - 2008-01-12 15:05:31
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv31494/src Modified Files: itunesdbwriter.h itunesdbwriter.cpp Log Message: implementing write flags to specify what needs to be written Index: itunesdbwriter.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbwriter.cpp,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** itunesdbwriter.cpp 4 Jan 2008 21:20:21 -0000 1.26 --- itunesdbwriter.cpp 12 Jan 2008 15:05:33 -0000 1.27 *************** *** 42,65 **** ItunesDBWriter::~ItunesDBWriter() {} /*! \fn itunesdb::ItunesDBWriter::write(QFile& file) */ ! void ItunesDBWriter::write(QFile& file) { ! // FIXME implement error handling - like when the disk is full and the db cannot be written ! QByteArray trackdata; ! QByteArray playlistdata; if ( !file.open( IO_WriteOnly) ) { m_datasource.handleError( file.name() + " could not be opened for writing!" ); ! return; } m_datasource.writeInit(); - fillTrackBuffer( trackdata); - fillPlaylistBuffer( playlistdata); - // write to file QDataStream stream( &file); --- 42,102 ---- ItunesDBWriter::~ItunesDBWriter() {} + #if 0 + inline void writeMHIA( const QString& artist, const QString& album, Q_UINT32 albumID, QDataStream& datastream ) { + QBuffer io_buffer; + io_buffer.open(IO_WriteOnly); + QDataStream bufferstream( &io_buffer ); + bufferstream.setByteOrder( QDataStream::LittleEndian); + bufferstream << (Q_UINT32) 0x6169686D; // mhia + bufferstream << (Q_UINT32) 0x58; // size of header + bufferstream << (Q_UINT32) 0x0; // length of header plus child records + bufferstream << (Q_UINT32) 0x2; // number of string child records + bufferstream << (Q_UINT32) albumID; // TODO + bufferstream << (Q_UINT64) 0x0; // TODO DBID??? + bufferstream << (Q_UINT32) 0x2; // TODO number of child records again??? + + + } + + inline void writeMHLA( QByteArray& buffer, const TrackPtrList::Iterator& tracks ) { + TrackPtrList allTracks( tracks ); + allTracks.sort(); + + QString lastAlbum; + QString lastArtist; + + TrackPtrList::ConstIterator trackIter = allTracks.const_iterator(); + while ( trackIter.hasNext() ) { + Track * track = trackIter.next(); + + if ( track->getAlbum().compare( lastAlbum ) != 0 || track->getArtist().compare( lastArtist ) != 0 ) { + lastAlbum = track->getAlbum(); + lastArtist = track->getArtist(); + writeMHIA( lastArtist, lastAlbum, track->getAlbumID(), stream ); + } + } + + } + #endif /*! \fn itunesdb::ItunesDBWriter::write(QFile& file) */ ! bool ItunesDBWriter::write( QFile& file, int flags ) { ! if ( flags == ItunesDBWriter::None ) { ! return false; ! } ! ! // TODO/FIXME implement error handling - like when the disk is full and the db cannot be written ! QByteArray buffer; if ( !file.open( IO_WriteOnly) ) { m_datasource.handleError( file.name() + " could not be opened for writing!" ); ! return false; } m_datasource.writeInit(); // write to file QDataStream stream( &file); *************** *** 86,110 **** } // write track data ! stream.writeRawBytes( trackdata.data(), trackdata.size()); // write playlist data ! stream.writeRawBytes( playlistdata.data(), playlistdata.size()); file.at( 8); stream << (Q_UINT32) file.size(); ! stream.unsetDevice(); file.flush(); ! #ifdef WIN32 FlushFileBuffers( (HANDLE)file.handle() ); #else fsync( file.handle() ); #endif ! file.close(); m_datasource.writeFinished(); } --- 123,156 ---- } + if ( flags & ItunesDBWriter::Has_AlbumInfo ) { + // TODO write mhla/mhia-s here + } + // write track data ! fillTrackBuffer( buffer ); ! stream.writeRawBytes( buffer.data(), buffer.size() ); ! buffer.resize( 0 ); // write playlist data ! fillPlaylistBuffer( buffer ); ! stream.writeRawBytes( buffer.data(), buffer.size() ); file.at( 8); stream << (Q_UINT32) file.size(); ! stream.unsetDevice(); file.flush(); ! #ifdef WIN32 FlushFileBuffers( (HANDLE)file.handle() ); #else fsync( file.handle() ); #endif ! file.close(); m_datasource.writeFinished(); + + return true; } *************** *** 169,209 **** } - #if 0 - inline void writeMHIA( const QString& artist, const QString& album, Q_UINT16 albumID, QDataStream& datastream ) { - QBuffer io_buffer; - io_buffer.open(IO_WriteOnly); - QDataStream bufferstream( &io_buffer ); - bufferstream.setByteOrder( QDataStream::LittleEndian); - bufferstream << (Q_UINT32) 0x6169686D; // mhia - bufferstream << (Q_UINT32) 0x58; // size of header - bufferstream << (Q_UINT32) 0x0; // length of header plus child records - bufferstream << (Q_UINT32) 0x2; // number of string child records - bufferstream << (Q_UINT32) 0x0; // TODO - bufferstream << (Q_UINT64) 0x0; // TODO DBID??? - bufferstream << (Q_UINT32) 0x2; // TODO number of child records again??? - - - } - - inline void writeMHLA( QDataStream& stream, const TrackPtrList::Iterator& tracks ) { - TrackPtrList allTracks( tracks ); - allTracks.sort(); - - QString lastAlbum; - QString lastArtist; - - TrackPtrList::ConstIterator trackIter = allTracks.const_iterator(); - while ( trackIter.hasNext() ) { - Track * track = trackIter.next(); - - if ( track->getAlbum().compare( lastAlbum ) != 0 || track->getArtist().compare( lastArtist ) != 0 ) { - lastAlbum = track->getAlbum(); - lastArtist = track->getArtist(); - writeMHIA( lastArtist, lastAlbum, track->getAlbumID(), stream ); - } - } - - } - #endif void itunesdb::ItunesDBWriter::fillTrackBuffer( QByteArray& buffer ) --- 215,218 ---- *************** *** 229,234 **** stream << (Q_UINT32) 0; // pad the rest (80 bytes) - // writeMHLA( stream, m_datasource.getTrackList().iterator() ); - // list the tracks TrackPtrList& trackPtrList( m_datasource.getTrackList() ); --- 238,241 ---- Index: itunesdbwriter.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbwriter.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** itunesdbwriter.h 14 Dec 2007 12:15:02 -0000 1.6 --- itunesdbwriter.h 12 Jan 2008 15:05:33 -0000 1.7 *************** *** 41,44 **** --- 41,52 ---- class ItunesDBWriter{ public: + enum Flags { + None = 0x0, + Has_Podcasts = 0x1, + Has_AlbumInfo = 0x2, + Has_CheckSum = 0x4, + Has_All = 0xFFFFFFFF + }; + ItunesDBWriter(ItunesDBDataSource & trackdatasource); *************** *** 54,59 **** * Writes the contents of the ItunesDBDataSource to the given file * @param file the file to write the information to */ ! void write(QFile& file); /** --- 62,68 ---- * Writes the contents of the ItunesDBDataSource to the given file * @param file the file to write the information to + * @return true if the operation was successful, false otherwise */ ! bool write( QFile& file, int flags = Has_All ); /** |
From: Michael S. <fr...@us...> - 2008-01-12 15:04:29
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv31090/src Modified Files: playlist.cpp Log Message: changed some comments Index: playlist.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlist.cpp,v retrieving revision 1.66 retrieving revision 1.67 diff -C2 -d -r1.66 -r1.67 *** playlist.cpp 22 Dec 2007 10:28:11 -0000 1.66 --- playlist.cpp 12 Jan 2008 15:04:24 -0000 1.67 *************** *** 57,62 **** mIsPodcast( src.mIsPodcast ), m_order( src.m_order ), mSplRuleSet( NULL ) { ! // TODO ATTENTION smart playlist rules won't get copied ! // TODO ATTENTION tracks won't get copied // printf( "copying playlist %s\n", src.getTitle().ascii() ); m_tracklist.setComparator( src.m_tracklist.getComparator() ); --- 57,62 ---- mIsPodcast( src.mIsPodcast ), m_order( src.m_order ), mSplRuleSet( NULL ) { ! // ATTENTION smart playlist rules won't get copied ! // ATTENTION tracks won't get copied // printf( "copying playlist %s\n", src.getTitle().ascii() ); m_tracklist.setComparator( src.m_tracklist.getComparator() ); |
From: Michael S. <fr...@us...> - 2008-01-04 21:20:25
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv24088/src Modified Files: listitem.cpp itunesdbwriter.cpp itunesdblistener.h itunesdbparser.cpp listitem.h itunesdb_rw.cpp Log Message: parser side implementation of MHIA handling Index: listitem.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/listitem.cpp,v retrieving revision 1.28 retrieving revision 1.29 diff -C2 -d -r1.28 -r1.29 *** listitem.cpp 15 Dec 2007 19:11:56 -0000 1.28 --- listitem.cpp 4 Jan 2008 21:20:21 -0000 1.29 *************** *** 60,63 **** --- 60,65 ---- case MHOD_ALBUMARTIST_FOR_SORT: case MHOD_COMPOSER_FOR_SORT: + case MHOD_ALBUMINFO_TITLE: + case MHOD_ALBUMINFO_ARTIST: return true; default: *************** *** 191,194 **** --- 193,198 ---- case MHOD_ALBUMARTIST_FOR_SORT: case MHOD_COMPOSER_FOR_SORT: + case MHOD_ALBUMINFO_TITLE: + case MHOD_ALBUMINFO_ARTIST: { uint ucs2len = ( blocklen - 40 ) / sizeof( Q_UINT16 ); Index: listitem.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/listitem.h,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** listitem.h 21 Dec 2007 09:27:08 -0000 1.24 --- listitem.h 4 Jan 2008 21:20:21 -0000 1.25 *************** *** 60,72 **** MHOD_ARTIST_FOR_SORT = 23, MHOD_KEYWORDS = 24, ! MHOD_TITLE_FOR_SORT = 27, // TODO ! MHOD_ALBUM_FOR_SORT = 28, // TODO ! MHOD_ALBUMARTIST_FOR_SORT = 29, // TODO ! MHOD_COMPOSER_FOR_SORT = 30, // TODO MHOD_SMART_PLAYLIST_INFO = 50, MHOD_SMART_PLAYLIST_IRULES = 51, MHOD_LIBRARY_PLAYLIST_INDEX = 52, MHOD_LIBRARY_PLAYLIST_LETTER_JUMP_TABLE = 53, ! MHOD_PLAYLIST = 100 }; --- 60,74 ---- MHOD_ARTIST_FOR_SORT = 23, MHOD_KEYWORDS = 24, ! MHOD_TITLE_FOR_SORT = 27, ! MHOD_ALBUM_FOR_SORT = 28, ! MHOD_ALBUMARTIST_FOR_SORT = 29, ! MHOD_COMPOSER_FOR_SORT = 30, MHOD_SMART_PLAYLIST_INFO = 50, MHOD_SMART_PLAYLIST_IRULES = 51, MHOD_LIBRARY_PLAYLIST_INDEX = 52, MHOD_LIBRARY_PLAYLIST_LETTER_JUMP_TABLE = 53, ! MHOD_PLAYLIST = 100, ! MHOD_ALBUMINFO_TITLE = 0xC8, ! MHOD_ALBUMINFO_ARTIST = 0xC9 }; *************** *** 78,82 **** ITEMTYPE_TRACK = 1, ITEMTYPE_PLAYLISTITEM = 2, ! ITEMTYPE_PLAYLIST = 3 }; // known implementors --- 80,85 ---- ITEMTYPE_TRACK = 1, ITEMTYPE_PLAYLISTITEM = 2, ! ITEMTYPE_PLAYLIST = 3, ! ITEMTYPE_ALBUMINFO = 4 }; // known implementors Index: itunesdblistener.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdblistener.h,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** itunesdblistener.h 31 Mar 2007 12:31:17 -0000 1.10 --- itunesdblistener.h 4 Jan 2008 21:20:21 -0000 1.11 *************** *** 101,104 **** --- 101,110 ---- /** + * handles the given albuminfo. + * @param albumInfo a ListItem describing the album information. Implementors of this method need to take care of the pointer. + */ + virtual void handleAlbumInfo( ListItem * albumInfo ) = 0; + + /** * gets called at the beginning of the parse process. */ Index: itunesdb_rw.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdb_rw.cpp,v retrieving revision 1.36 retrieving revision 1.37 diff -C2 -d -r1.36 -r1.37 *** itunesdb_rw.cpp 17 Dec 2007 21:06:17 -0000 1.36 --- itunesdb_rw.cpp 4 Jan 2008 21:20:24 -0000 1.37 *************** *** 194,197 **** --- 194,206 ---- m_currentDataSet = type; } + + virtual void handleAlbumInfo( ListItem * item ) { + #ifdef ALBUMINFO_DEBUG + QString artist = item->getItemProperty( MHOD_ALBUMINFO_ARTIST ); + QString album = item->getItemProperty( MHOD_ALBUMINFO_TITLE ); + printf( "handled mhia album info for %s - %s\n", artist.ascii(), album.ascii() ); + #endif + delete item; + } virtual void setNumPlaylists(Q_UINT32) {} Index: itunesdbwriter.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbwriter.cpp,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** itunesdbwriter.cpp 28 Dec 2007 11:40:22 -0000 1.25 --- itunesdbwriter.cpp 4 Jan 2008 21:20:21 -0000 1.26 *************** *** 169,173 **** } ! inline void writeMHIA( const QString& artist, const QString& album, Q_UINT16 albumID, QDataStream& datastream ) { QBuffer io_buffer; --- 169,173 ---- } ! #if 0 inline void writeMHIA( const QString& artist, const QString& album, Q_UINT16 albumID, QDataStream& datastream ) { QBuffer io_buffer; *************** *** 205,208 **** --- 205,209 ---- } + #endif void itunesdb::ItunesDBWriter::fillTrackBuffer( QByteArray& buffer ) Index: itunesdbparser.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbparser.cpp,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** itunesdbparser.cpp 14 Dec 2007 08:40:06 -0000 1.19 --- itunesdbparser.cpp 4 Jan 2008 21:20:21 -0000 1.20 *************** *** 90,94 **** stream >> filesize; ! // TODO dbID setzen // skip the rest of the header --- 90,94 ---- stream >> filesize; ! // TODO header info (dbID, version number etc) setzen // skip the rest of the header *************** *** 229,242 **** case 0x616C686D: // mhla // ignore this record - // TODO add a callback function for this in the listener interface stream >> blocklen; itunesdb::utils::seekRelative( stream, blocklen - 8 ); break; case 0x6169686D: // mhia - // ignore this and all its childs - // TODO add it to the list of mhia records controlled by the corresponding mhla stream >> blocklen; ! stream >> blocklen; ! itunesdb::utils::seekRelative( stream, blocklen - 12 ); break; default: { --- 229,245 ---- case 0x616C686D: // mhla // ignore this record stream >> blocklen; itunesdb::utils::seekRelative( stream, blocklen - 8 ); break; case 0x6169686D: // mhia stream >> blocklen; ! if( listitem != NULL ) { ! handleItem( *listitem ); ! } ! ! listitem = new ListItem( ITEMTYPE_ALBUMINFO ); ! ! // ignore the rest ! itunesdb::utils::seekRelative( stream, blocklen - 8 ); break; default: { *************** *** 400,403 **** --- 403,411 ---- } break; + case ITEMTYPE_ALBUMINFO: { + item.doneAddingData(); + listener->handleAlbumInfo( &item ); + } + break; } } |
Update of /cvsroot/kpod/ipodslave/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv1427/src Modified Files: consistencycheck.cpp vfs.h ipodslave.cpp fileutils.cpp kpod.cpp ipodslave.h consistencycheck.h .cvsignore Log Message: libqtpod HEAD dev adoptions Index: .cvsignore =================================================================== RCS file: /cvsroot/kpod/ipodslave/src/.cvsignore,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** .cvsignore 10 Dec 2007 23:12:55 -0000 1.2 --- .cvsignore 28 Dec 2007 11:43:11 -0000 1.3 *************** *** 6,7 **** --- 6,9 ---- .deps .libs + vfs.loT + *.loT Index: ipodslave.cpp =================================================================== RCS file: /cvsroot/kpod/ipodslave/src/ipodslave.cpp,v retrieving revision 1.113 retrieving revision 1.114 diff -C2 -d -r1.113 -r1.114 *** ipodslave.cpp 17 Dec 2007 23:14:21 -0000 1.113 --- ipodslave.cpp 28 Dec 2007 11:43:11 -0000 1.114 *************** *** 204,208 **** // redirect to file ! redirection( KURL( QString( "file:" ) + track->getFilePath() ) ); } break; --- 204,208 ---- // redirect to file ! redirection( KURL( QString( "file:" ) + ipod->getFileForPathInfo( track->getPathInfo() ) ) ); } break; *************** *** 262,266 **** return; } ! mimeType( KMimeType::findByPath( track->getFilePath() )->name() ); } break; --- 262,266 ---- return; } ! mimeType( KMimeType::findByPath( ipod->getFileForPathInfo( track->getPathInfo() ) )->name() ); } break; *************** *** 444,448 **** direntry.clear(); QString trackname = formatTrackname( *track, item->getPosition(), trackdigits, true ); ! fillUDSEntry( ipod->getITunesDB(), direntry, trackname, *track, S_IFREG, false ); listEntry( direntry, false ); } --- 444,448 ---- direntry.clear(); QString trackname = formatTrackname( *track, item->getPosition(), trackdigits, true ); ! fillUDSEntry( *ipod, direntry, trackname, *track, S_IFREG, false ); listEntry( direntry, false ); } *************** *** 491,495 **** direntry.clear(); QString trackname= formatTrackname( *track, ++tracknum, trackdigits, false ); ! fillUDSEntry( ipod->getITunesDB(), direntry, trackname, *track, S_IFREG, false ); // appendUDSAtom( direntry, KIO::UDS_URL, url.url() + "/" + trackname ); listEntry( direntry, false); --- 491,495 ---- direntry.clear(); QString trackname= formatTrackname( *track, ++tracknum, trackdigits, false ); ! fillUDSEntry( *ipod, direntry, trackname, *track, S_IFREG, false ); // appendUDSAtom( direntry, KIO::UDS_URL, url.url() + "/" + trackname ); listEntry( direntry, false); *************** *** 557,561 **** // redirection( KURL( QString( "file:" ) + track->getFilePath() ) ); ! fillUDSEntry( ipod->getITunesDB(), direntry, dirmodel.getFilename(), *track, S_IFREG, false ); // appendUDSAtom( direntry, KIO::UDS_URL, url.url() ); statEntry( direntry); --- 557,561 ---- // redirection( KURL( QString( "file:" ) + track->getFilePath() ) ); ! fillUDSEntry( *ipod, direntry, dirmodel.getFilename(), *track, S_IFREG, false ); // appendUDSAtom( direntry, KIO::UDS_URL, url.url() ); statEntry( direntry); *************** *** 701,705 **** if( dirmodel.getCategory() == DirectoryModel::Artists) { // remove Track ! QFile trackfile( pTrack->getFilePath() ); if ( trackfile.exists() && !trackfile.remove() ) { kdDebug() << "ipodslave::del() : track could not be deleted " << dirmodel.getFilename() << endl; --- 701,705 ---- if( dirmodel.getCategory() == DirectoryModel::Artists) { // remove Track ! QFile trackfile( ipod->getFileForPathInfo( pTrack->getPathInfo() ) ); if ( trackfile.exists() && !trackfile.remove() ) { kdDebug() << "ipodslave::del() : track could not be deleted " << dirmodel.getFilename() << endl; *************** *** 990,998 **** // create new TrackID / filename etc ITunesDBTrack * dest_track = dest_ipod->getITunesDB().createNewTrack(); ! // append the real file extension to the path ! dest_track->setFileExtension( dest.getFileExtension() ); ! QFile src_file( src_track->getFilePath() ); ! QFile dest_file( dest_track->getFilePath() ); // check available disk space --- 990,997 ---- // create new TrackID / filename etc ITunesDBTrack * dest_track = dest_ipod->getITunesDB().createNewTrack(); ! dest_track->setPathInfo( dest_ipod->findNewTrackPathInfo( dest_track->getID(), dest.getFileExtension() ) ); ! QFile src_file( src_ipod->getFileForPathInfo( src_track->getPathInfo() ) ); ! QFile dest_file( dest_ipod->getFileForPathInfo( dest_track->getPathInfo() ) ); // check available disk space *************** *** 1109,1118 **** // TODO check against libqtpod-0.3.1 API void kio_ipodslaveProtocol::doPut( KPod& ipod, const DirectoryModel& dirmodel ) { ! ITunesDBTrack * track = ipod.getITunesDB().createNewTrack( dirmodel.getFileExtension() ); // copy track to iPod (file wise) ! QFile outfile( track->getFilePath() ); if ( outfile.exists() ) { ! error( ERR_SLAVE_DEFINED, "File " + track->getFilePath() + " already exists." ); return; } --- 1108,1119 ---- // TODO check against libqtpod-0.3.1 API void kio_ipodslaveProtocol::doPut( KPod& ipod, const DirectoryModel& dirmodel ) { ! ITunesDBTrack * track = ipod.getITunesDB().createNewTrack(); ! track->setPathInfo( ipod.findNewTrackPathInfo( track->getID(), dirmodel.getFileExtension() ) ); // copy track to iPod (file wise) ! QString filepath = ipod.getFileForPathInfo( track->getPathInfo() ); ! QFile outfile( filepath ); if ( outfile.exists() ) { ! error( ERR_SLAVE_DEFINED, "File " + filepath + " already exists." ); return; } *************** *** 1392,1399 **** */ // TODO check against libqtpod-0.3.1 API ! void kio_ipodslaveProtocol::fillUDSEntry( const ITunesDB& db, UDSEntry &entry, const QString &name, const itunesdb::Track& track, long type, bool changed) { QString filename= QFile::decodeName( name.local8Bit().replace( "/", "%2f" ) ); ! const QString localPath( db.getFileForPathInfo( track.getPathInfo() ) ); appendUDSAtom( entry, KIO::UDS_NAME, filename); appendUDSAtom( entry, KIO::UDS_FILE_TYPE, type); --- 1393,1400 ---- */ // TODO check against libqtpod-0.3.1 API ! void kio_ipodslaveProtocol::fillUDSEntry( const KPod& ipod, UDSEntry &entry, const QString &name, const itunesdb::Track& track, long type, bool changed) { QString filename= QFile::decodeName( name.local8Bit().replace( "/", "%2f" ) ); ! const QString localPath( ipod.getFileForPathInfo( track.getPathInfo() ) ); appendUDSAtom( entry, KIO::UDS_NAME, filename); appendUDSAtom( entry, KIO::UDS_FILE_TYPE, type); Index: kpod.cpp =================================================================== RCS file: /cvsroot/kpod/ipodslave/src/kpod.cpp,v retrieving revision 1.27 retrieving revision 1.28 diff -C2 -d -r1.27 -r1.28 *** kpod.cpp 18 Dec 2007 18:02:25 -0000 1.27 --- kpod.cpp 28 Dec 2007 11:43:11 -0000 1.28 *************** *** 190,194 **** } ! QString filename = getITunesDB().getFileForPathInfo( track->getPathInfo() ); if ( QFile::exists( filename ) ) { QFile::remove( filename ); --- 190,194 ---- } ! QString filename = getFileForPathInfo( track->getPathInfo() ); if ( QFile::exists( filename ) ) { QFile::remove( filename ); *************** *** 542,545 **** --- 542,547 ---- /* 46 */ valuebuffer << QString().setNum( track.getSeasonNumber(), 36 ); /* 47 */ valuebuffer << QString().setNum( track.getEpisodeNumber(), 36 ); + /* 48 */ valuebuffer << QString().setNum( track.getArtworkCount(), 36 ); + /* 49 */ valuebuffer << QString().setNum( track.getArtworkSize(), 36 ); return valuebuffer; *************** *** 649,652 **** --- 651,656 ---- const Q_UINT32 getSeasonNumber() { return values[ 46 ].toUInt( NULL, 36 ); } const Q_UINT32 getEpisodeNumber() { return values[ 47 ].toUInt( NULL, 36 ); } + const Q_UINT32 getArtworkCount() { return values[ 48 ].toUInt( NULL, 36 ); } + const Q_UINT32 getArtworkSize() { return values[ 49 ].toUInt( NULL, 36 ); } }; ITunesDBTrack * KPod::readTrackFromLogEntry( const QStringList& values ) { Index: vfs.h =================================================================== RCS file: /cvsroot/kpod/ipodslave/src/vfs.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** vfs.h 18 Dec 2007 18:04:57 -0000 1.1 --- vfs.h 28 Dec 2007 11:43:11 -0000 1.2 *************** *** 106,109 **** --- 106,117 ---- std::string mimetype( const std::string& path, KIO::SlaveBase& drain ); + + /** + * Returns true if the node is visible and should be taken into account when + * handling a VFS request + * Default implementation returns true - reimplement this method to dynamically + * enable/disable nodes depending on application state. + */ + virtual bool isVisible() const; irgendwo müssen schon die gesammelten Daten abgelegt werden ... Context? Index: consistencycheck.cpp =================================================================== RCS file: /cvsroot/kpod/ipodslave/src/consistencycheck.cpp,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** consistencycheck.cpp 17 Dec 2007 23:14:21 -0000 1.8 --- consistencycheck.cpp 28 Dec 2007 11:43:11 -0000 1.9 *************** *** 49,69 **** class MissingFileTrackPredicate : public TrackPredicate { ! const ITunesDB& m_itunesdb; public: ! MissingFileTrackPredicate( const ITunesDB& itunesdb ) : ! m_itunesdb( itunesdb ) {} virtual ~MissingFileTrackPredicate() {} bool operator () ( const Track * track ) const { ! return track && !QFile( m_itunesdb.getFileForPathInfo( track->getPathInfo() ) ).exists(); } }; ! void ConsistencyCheck::printMissingFilesTable( const ITunesDB& itunesdb, QTextStream& stream ) { // get the tracks that reference to non existing files ITunesDB::FilteredTrackConstIterator<MissingFileTrackPredicate> missingTracksIter = ! itunesdb.getTracksBy( MissingFileTrackPredicate( itunesdb ) ); stream << "Missing Files" << endl; --- 49,70 ---- class MissingFileTrackPredicate : public TrackPredicate { ! const KPod& m_ipod; public: ! MissingFileTrackPredicate( const KPod& ipod ) : ! m_ipod( ipod ) {} virtual ~MissingFileTrackPredicate() {} bool operator () ( const Track * track ) const { ! return track && !QFile( m_ipod.getFileForPathInfo( track->getPathInfo() ) ).exists(); } }; ! void ConsistencyCheck::printMissingFilesTable( const KPod& ipod, QTextStream& stream ) { // get the tracks that reference to non existing files + const ITunesDB& itunesdb = ipod.getITunesDB(); ITunesDB::FilteredTrackConstIterator<MissingFileTrackPredicate> missingTracksIter = ! itunesdb.getTracksBy( MissingFileTrackPredicate( ipod ) ); stream << "Missing Files" << endl; *************** *** 75,79 **** stream << "<tr><td><pre>"; stream << track->getArtist() << "\n" << track->getAlbum() << "\n" << track->getTitle() << "</pre></td>"; ! stream << "<td><pre>" << track->getFilePath() << "</pre></td></tr>" << endl; numFiles++; } --- 76,80 ---- stream << "<tr><td><pre>"; stream << track->getArtist() << "\n" << track->getAlbum() << "\n" << track->getTitle() << "</pre></td>"; ! stream << "<td><pre>" << ipod.getFileForPathInfo( track->getPathInfo() ) << "</pre></td></tr>" << endl; numFiles++; } *************** *** 87,91 **** ITunesDB& itunesdb = ipod.getITunesDB(); ITunesDB::FilteredTrackConstIterator<MissingFileTrackPredicate> missingTracksIter = ! itunesdb.getTracksBy( MissingFileTrackPredicate( itunesdb ) ); while ( missingTracksIter.hasNext() ) { --- 88,92 ---- ITunesDB& itunesdb = ipod.getITunesDB(); ITunesDB::FilteredTrackConstIterator<MissingFileTrackPredicate> missingTracksIter = ! itunesdb.getTracksBy( MissingFileTrackPredicate( ipod ) ); while ( missingTracksIter.hasNext() ) { *************** *** 94,99 **** } ! void ConsistencyCheck::printMultipleReferencedFiles( const ITunesDB& itunesdb, QTextStream& stream ) { ! MultipleTrackDict multipleReferenced( itunesdb.getNumTracks(), false ); multipleReferenced.setAutoDelete( true ); --- 95,100 ---- } ! void ConsistencyCheck::printMultipleReferencedFiles( const KPod& ipod, QTextStream& stream ) { ! const ITunesDB& itunesdb = ipod.getITunesDB(); MultipleTrackDict multipleReferenced( itunesdb.getNumTracks(), false ); multipleReferenced.setAutoDelete( true ); *************** *** 101,108 **** while ( allTracksIter.hasNext() ) { ITunesDBTrack * track = allTracksIter.next(); ! TrackPtrList * sameFileList = multipleReferenced.find( track->getFilePath() ); if ( !sameFileList ) { sameFileList = new TrackPtrList(); ! multipleReferenced.insert( track->getFilePath(), sameFileList ); } sameFileList->append( track ); --- 102,110 ---- while ( allTracksIter.hasNext() ) { ITunesDBTrack * track = allTracksIter.next(); ! QString filepath = ipod.getFileForPathInfo( track->getPathInfo() ); ! TrackPtrList * sameFileList = multipleReferenced.find( filepath ); if ( !sameFileList ) { sameFileList = new TrackPtrList(); ! multipleReferenced.insert( filepath, sameFileList ); } sameFileList->append( track ); *************** *** 142,148 **** ITunesDBTrack * track = itunesdb.createNewTrack(); track->setPathInfo( *unrefIter ); ! QString filePath = track->getFilePath(); ! if ( !FileUtils::readMP3Metadata( track->getFilePath(), track ) ) { #ifdef CONSISTENCY_CHECK_ENSURE_CONSISTENCY QFile( filePath ).remove(); --- 144,150 ---- ITunesDBTrack * track = itunesdb.createNewTrack(); track->setPathInfo( *unrefIter ); ! QString filePath = ipod.getFileForPathInfo( track->getPathInfo() ); ! if ( !FileUtils::readMP3Metadata( filePath, track ) ) { #ifdef CONSISTENCY_CHECK_ENSURE_CONSISTENCY QFile( filePath ).remove(); *************** *** 183,188 **** void ConsistencyCheck::handleRequest( KPod& ipod, const KURL& url, QByteArray& response, QString& mimeType ) { - ITunesDB& itunesdb = ipod.getITunesDB(); - QTextOStream stream( response ); QString title= ipod.getName(); --- 185,188 ---- *************** *** 192,199 **** // multiple referenced files table ! printMultipleReferencedFiles( itunesdb, stream ); // missing files table ! printMissingFilesTable( itunesdb, stream ); #ifdef CONSISTENCY_CHECK_ENSURE_CONSISTENCY --- 192,199 ---- // multiple referenced files table ! printMultipleReferencedFiles( ipod, stream ); // missing files table ! printMissingFilesTable( ipod, stream ); #ifdef CONSISTENCY_CHECK_ENSURE_CONSISTENCY Index: fileutils.cpp =================================================================== RCS file: /cvsroot/kpod/ipodslave/src/fileutils.cpp,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** fileutils.cpp 2 Jul 2007 22:42:30 -0000 1.12 --- fileutils.cpp 28 Dec 2007 11:43:11 -0000 1.13 *************** *** 41,44 **** --- 41,46 ---- ID3_Tag id3tag; const Mp3_Headerinfo * mp3header; + Q_UINT32 artworksz; + Q_UINT16 artworkct; inline Q_UINT32 getUIntField( ID3_FrameID frameID, ID3_FieldID fieldID ) { *************** *** 53,62 **** return result; } public: ! MP3MetaDataProvider( const QString& filename ) : fileInfo( filename ), id3tag( filename ) { ! // kdDebug() << "MP3MetaDataProvider( const QString& filename )" << endl; mp3header = id3tag.GetMp3HeaderInfo(); ! // kdDebug() << "MP3MetaDataProvider( const QString& filename ) end" << endl; } virtual ~MP3MetaDataProvider() { } --- 55,82 ---- return result; } + + inline void initArtworkInfo() { + ID3_Frame * frame = NULL; + ID3_Tag::Iterator * frameIter = id3tag.CreateIterator(); + while ( ( frame = frameIter->GetNext() ) != NULL ) { + if ( frame->GetID() == ID3FID_PICTURE ) { + ID3_Field * field = frame->GetField(ID3FN_DATA); + if ( field ) { + artworksz += field->Size(); + ++artworkct; + } + } + } + } public: ! MP3MetaDataProvider( const QString& filename ) ! : fileInfo( filename ), id3tag( filename ), ! artworksz( 0 ), artworkct( 0 ) { ! kdDebug() << "MP3MetaDataProvider( const QString& filename )" << endl; mp3header = id3tag.GetMp3HeaderInfo(); ! initArtworkInfo(); ! kdDebug() << "Artwork count/size " << artworkct << "/" << artworksz << endl; ! kdDebug() << "MP3MetaDataProvider( const QString& filename ) end" << endl; } virtual ~MP3MetaDataProvider() { } *************** *** 301,304 **** --- 321,330 ---- return id3tag.Find( ID3FID_SYNCEDLYRICS ) != NULL || id3tag.Find( ID3FID_UNSYNCEDLYRICS ) != NULL; } + Q_UINT16 getArtworkCount() const { + return artworkct; + } + Q_UINT32 getArtworkSize() const { + return artworksz; + } }; Index: consistencycheck.h =================================================================== RCS file: /cvsroot/kpod/ipodslave/src/consistencycheck.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** consistencycheck.h 22 Oct 2007 22:09:49 -0000 1.2 --- consistencycheck.h 28 Dec 2007 11:43:11 -0000 1.3 *************** *** 35,40 **** typedef QDictIterator<itunesdb::TrackPtrList> MultipleTrackDictIter; ! void printMissingFilesTable( const ITunesDB& itunesdb, QTextStream& stream ); ! void printMultipleReferencedFiles( const ITunesDB& itunesdb, QTextStream& stream ); void checkForUnreferencedFiles( KPod& ipod, QTextStream& stream ); void removeMissingFileTracks( KPod& ipod ); --- 35,40 ---- typedef QDictIterator<itunesdb::TrackPtrList> MultipleTrackDictIter; ! void printMissingFilesTable( const KPod& itunesdb, QTextStream& stream ); ! void printMultipleReferencedFiles( const KPod& itunesdb, QTextStream& stream ); void checkForUnreferencedFiles( KPod& ipod, QTextStream& stream ); void removeMissingFileTracks( KPod& ipod ); Index: ipodslave.h =================================================================== RCS file: /cvsroot/kpod/ipodslave/src/ipodslave.h,v retrieving revision 1.29 retrieving revision 1.30 diff -C2 -d -r1.29 -r1.30 *** ipodslave.h 7 Mar 2007 07:39:02 -0000 1.29 --- ipodslave.h 28 Dec 2007 11:43:11 -0000 1.30 *************** *** 63,67 **** long logfileentrypos; // the number of logfile entries we already know about ! void fillUDSEntry(const ITunesDB& db, KIO::UDSEntry& entry, const QString& name, const itunesdb::Track& track, long type, bool changed); void fillUDSEntry(KIO::UDSEntry& entry, const QString& name, size_t size, long type, bool changed, uint lastmodified, const QString *mimetype = NULL); void appendUDSAtom(KIO::UDSEntry& entry, unsigned int uds, long longinfo); --- 63,67 ---- long logfileentrypos; // the number of logfile entries we already know about ! void fillUDSEntry(const KPod& db, KIO::UDSEntry& entry, const QString& name, const itunesdb::Track& track, long type, bool changed); void fillUDSEntry(KIO::UDSEntry& entry, const QString& name, size_t size, long type, bool changed, uint lastmodified, const QString *mimetype = NULL); void appendUDSAtom(KIO::UDSEntry& entry, unsigned int uds, long longinfo); |
From: Michael S. <fr...@us...> - 2007-12-28 11:41:38
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv660/src Modified Files: track.h track.cpp Log Message: setArtwork info plus some comparator case sense fixes Index: track.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/track.cpp,v retrieving revision 1.73 retrieving revision 1.74 diff -C2 -d -r1.73 -r1.74 *** track.cpp 21 Dec 2007 11:39:59 -0000 1.73 --- track.cpp 28 Dec 2007 11:41:40 -0000 1.74 *************** *** 66,70 **** class TrackComparators::ByArtistField : public TrackComparator { virtual int compare( const itunesdb::Track& track1, const itunesdb::Track& track2 ) const { ! return track1.getArtist().localeAwareCompare( track2.getArtist() ); } }; --- 66,70 ---- class TrackComparators::ByArtistField : public TrackComparator { virtual int compare( const itunesdb::Track& track1, const itunesdb::Track& track2 ) const { ! return track1.getArtist().lower().localeAwareCompare( track2.getArtist().lower() ); } }; *************** *** 72,76 **** class TrackComparators::ByAlbumArtist : public TrackComparator { virtual int compare( const itunesdb::Track& track1, const itunesdb::Track& track2 ) const { ! return track1.getAlbumArtist().localeAwareCompare( track2.getAlbumArtist() ); } }; --- 72,76 ---- class TrackComparators::ByAlbumArtist : public TrackComparator { virtual int compare( const itunesdb::Track& track1, const itunesdb::Track& track2 ) const { ! return track1.getAlbumArtist().lower().localeAwareCompare( track2.getAlbumArtist().lower() ); } }; *************** *** 1324,1327 **** --- 1324,1334 ---- + void Track::setArtworkInfo( Q_UINT16 artworkCount, Q_UINT32 artworkSize ) { + mArtworkCount = artworkCount; + mArtworkSize = artworkSize; + mHasArtwork = artworkCount && artworkSize; + } + + void Track::doneAddingData() { // some checks Index: track.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/track.h,v retrieving revision 1.76 retrieving revision 1.77 diff -C2 -d -r1.76 -r1.77 *** track.h 21 Dec 2007 11:39:59 -0000 1.76 --- track.h 28 Dec 2007 11:41:40 -0000 1.77 *************** *** 552,555 **** --- 552,561 ---- Q_UINT16 getAlbumID() const { return mAlbumID; } + + void setArtworkInfo( Q_UINT16 artworkCount, Q_UINT32 artworkSize ); + + Q_UINT32 getArtworkSize() const { return mArtworkSize; } + + Q_UINT16 getArtworkCount() const { return mArtworkCount; } /** *************** *** 587,590 **** --- 593,597 ---- setSeasonNumber( provider.getSeasonNumber() ); setEpisodeNumber( provider.getEpisodeNumber() ); + setArtworkInfo( provider.getArtworkCount(), provider.getArtworkSize() ); // Track related technical stuff |
From: Michael S. <fr...@us...> - 2007-12-28 11:40:23
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv32720/src Modified Files: itunesdbwriter.cpp Log Message: more mhod53 development plus fixed MHOD52 additional field count Index: itunesdbwriter.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbwriter.cpp,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** itunesdbwriter.cpp 21 Dec 2007 11:38:49 -0000 1.24 --- itunesdbwriter.cpp 28 Dec 2007 11:40:22 -0000 1.25 *************** *** 311,318 **** --- 311,388 ---- }; + void sortIndices( const TrackComparatorPtr& comparator ) const { std::sort( &m_indices[ 0 ], &m_indices[ m_trackCount ], IndexComparator( comparator, m_trackPtrList ) ); } + + typedef struct MHOD53entry { + QChar letter; + Q_UINT32 startidx; + Q_UINT32 count; + MHOD53entry() : letter(), startidx( 0 ), count( 0 ) {} + }; + void writeMHOD53( QDataStream& stream, uint sortIndex ) const { + // write MHOD 53 + typedef std::vector<MHOD53entry> EntryList; + printf( "writing MHOD53 sorted by 0x0%x\n", sortIndex ); + EntryList entrylist( 26 ); + MHOD53entry entry; + for ( uint i = 0; i < m_trackCount; i++ ) { + Track * track = m_trackPtrList[ m_indices[ i ] ]; + QString property; + // implemented the simple, imperformant way since this is only done when writing the database + switch ( sortIndex ) { + case 0x03: + property = track->getTitle(); + break; + case 0x04: + property = track->getAlbum(); + break; + case 0x05: + property = track->getArtistNameForSort(); + if ( property.isEmpty() ) { + property = track->getArtist(); + } + break; + case 0x07: + property = track->getGenre(); + break; + case 0x12: + property = track->getComposer(); + break; + case 0x23: + property = track->getAlbumArtist(); + break; + case 0x24: + property = track->getArtist(); + break; + default: + // do nothing + return; + } + // printf( "%s\n", property.ascii() ); + property = property.left( 1 ).lower(); + if ( property.localeAwareCompare( entry.letter.lower() ) > 0 ) { + QChar newletter = property.at( 0 ); + if ( !entry.letter.isNull() ) { + printf( "letter jump for %s\n", property.ascii() ); + entry.count = i - entry.startidx; + entrylist.push_back( entry ); + } + entry.letter = newletter.upper(); + entry.startidx = i; + } + } + entry.count = m_trackCount - entry.startidx; + entrylist.push_back( entry ); + + EntryList::iterator entryIter = entrylist.begin(); + for ( ; entryIter != entrylist.end(); ++entryIter ) { + printf( "letter %c starts at %d with %d entries\n", entryIter->letter.latin1(), entryIter->startidx, entryIter->count ); + } + } + + void writeMHOD52( QDataStream& stream, uint sortIndex, const TrackComparatorPtr& comparator ) const { stream << (Q_UINT32) 0x646F686D; // mhod *************** *** 334,364 **** stream << (Q_UINT32) m_indices[ i ]; } - - #if 0 - // write MHOD 53 - if ( write53 ) { - struct MHOD53entry { - Q_UINT32 letter; - Q_UINT32 startidx; - Q_UINT32 count; - }; - std::slist<MHOD53entry> entrylist; - MHOD53entry entry; - for ( uint i = 0; i < m_trackCount; i++ ) { - Track * trackPtrList - if ( entry-> ... ) - } - } - #endif } virtual uint writeNonStringMHODs( QDataStream& outstream ) const { // write type52 MHODs writeMHOD52( outstream, 0x03, TrackComparators::BY_TITLE ); writeMHOD52( outstream, 0x04, TrackComparators::BY_ALBUM ); writeMHOD52( outstream, 0x05, TrackComparators::BY_ARTIST ); writeMHOD52( outstream, 0x07, TrackComparators::BY_GENRE ); writeMHOD52( outstream, 0x12, TrackComparators::BY_COMPOSER ); // writeMHOD52( outstream, 0x1D, TrackComparators::BY_TVSHOW ); --- 404,423 ---- stream << (Q_UINT32) m_indices[ i ]; } } + virtual uint writeNonStringMHODs( QDataStream& outstream ) const { // write type52 MHODs writeMHOD52( outstream, 0x03, TrackComparators::BY_TITLE ); + // writeMHOD53( outstream, 0x03 ); writeMHOD52( outstream, 0x04, TrackComparators::BY_ALBUM ); + // writeMHOD53( outstream, 0x04 ); writeMHOD52( outstream, 0x05, TrackComparators::BY_ARTIST ); + // writeMHOD53( outstream, 0x05 ); writeMHOD52( outstream, 0x07, TrackComparators::BY_GENRE ); + // writeMHOD53( outstream, 0x07 ); writeMHOD52( outstream, 0x12, TrackComparators::BY_COMPOSER ); + // writeMHOD53( outstream, 0x12 ); // writeMHOD52( outstream, 0x1D, TrackComparators::BY_TVSHOW ); *************** *** 366,373 **** // writeMHOD52( outstream, 0x1F, TrackComparators::BY_EPISODE ); writeMHOD52( outstream, 0x23, TrackComparators::BY_ALBUMARTIST ); writeMHOD52( outstream, 0x24, TrackComparators::BY_ARTISTFIELD ); ! return 5; } }; --- 425,434 ---- // writeMHOD52( outstream, 0x1F, TrackComparators::BY_EPISODE ); + + // TODO check why this doesn't work writeMHOD52( outstream, 0x23, TrackComparators::BY_ALBUMARTIST ); writeMHOD52( outstream, 0x24, TrackComparators::BY_ARTISTFIELD ); ! return 7; } }; |
From: Michael S. <fr...@us...> - 2007-12-28 11:39:15
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv32298/src Modified Files: itunesdb.h itunesdb.cpp Log Message: TODOs Index: itunesdb.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdb.h,v retrieving revision 1.83 retrieving revision 1.84 diff -C2 -d -r1.83 -r1.84 *** itunesdb.h 17 Dec 2007 21:06:17 -0000 1.83 --- itunesdb.h 28 Dec 2007 11:39:17 -0000 1.84 *************** *** 298,301 **** --- 298,302 ---- * Returns the last error occured during read/write * @return the last error occured during read/write + * TODO / FIXME reset Error here */ const QString& getLastError() const { return m_error; } Index: itunesdb.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdb.cpp,v retrieving revision 1.111 retrieving revision 1.112 diff -C2 -d -r1.111 -r1.112 *** itunesdb.cpp 21 Dec 2007 11:37:26 -0000 1.111 --- itunesdb.cpp 28 Dec 2007 11:39:17 -0000 1.112 *************** *** 469,472 **** --- 469,473 ---- } + // TODO reimplement this bool compatibleWith( QFile& oldItunesDBFile, QString& error ); |
From: Michael S. <fr...@us...> - 2007-12-28 11:38:06
|
Update of /cvsroot/kpod/ipodslave In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv31672 Modified Files: README TODO Log Message: stuff Index: README =================================================================== RCS file: /cvsroot/kpod/ipodslave/README,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** README 11 Dec 2007 21:35:30 -0000 1.14 --- README 28 Dec 2007 11:38:09 -0000 1.15 *************** *** 53,57 **** Bugs/noticable problems: ! * not compatible with ipod touch and ipod classic * when deleting a Track from a playlist the numbering of the tracks won't get reorganized (e.g. when deleting track 2 the list will be --- 53,58 ---- Bugs/noticable problems: ! * not fully compatible with ipod touch and ipod classic - synchronizing will not ! work - browsing and getting tracks off of the iPod should work * when deleting a Track from a playlist the numbering of the tracks won't get reorganized (e.g. when deleting track 2 the list will be Index: TODO =================================================================== RCS file: /cvsroot/kpod/ipodslave/TODO,v retrieving revision 1.57 retrieving revision 1.58 diff -C2 -d -r1.57 -r1.58 *** TODO 8 Jul 2006 13:26:45 -0000 1.57 --- TODO 28 Dec 2007 11:38:09 -0000 1.58 *************** *** 2,5 **** --- 2,6 ---- * test slashes in names because we moved the code that does a replace( "/", "%2f") with strings * FDESC Feld in TrackMetaDataProvider aktivieren (auskommentierter Code) + * SEARCH FOLDER where a subdir represets a query and the slave delivers a dir with all the fitting tracks TODO for later |
From: Michael S. <fr...@us...> - 2007-12-28 11:37:41
|
Update of /cvsroot/kpod/ipodslave In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv31509 Modified Files: ChangeLog Log Message: Chnagelogs for 0.8 Index: ChangeLog =================================================================== RCS file: /cvsroot/kpod/ipodslave/ChangeLog,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** ChangeLog 11 Dec 2007 21:24:21 -0000 1.14 --- ChangeLog 28 Dec 2007 11:37:42 -0000 1.15 *************** *** 1,4 **** --- 1,8 ---- Changelog for ipodslave + Changes for version 0.8 + * fixed bug writing/replaying log file when adding tracks + * fully adopted libqtpod-0.4 API changes + Changes for version 0.8-pre2 * changed libqtpod library version to 0.4.1 thus fixing problems with |
From: Michael S. <fr...@us...> - 2007-12-22 10:28:11
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv6918/src Modified Files: playlist.cpp Log Message: moved ptrWhenQT4 into utils.h Index: playlist.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlist.cpp,v retrieving revision 1.65 retrieving revision 1.66 diff -C2 -d -r1.65 -r1.66 *** playlist.cpp 24 Nov 2007 21:26:34 -0000 1.65 --- playlist.cpp 22 Dec 2007 10:28:11 -0000 1.66 *************** *** 27,36 **** #include "utils.h" - #if QT_VERSION >= 0x040000 - #define ptrWhenQT4(a) (&a) - #else - #define ptrWhenQT4(a) a - #endif - namespace itunesdb { --- 27,30 ---- |