00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef ITUNESDBSMARTPLAYLISTRULES_H
00025 #define ITUNESDBSMARTPLAYLISTRULES_H
00026
00027 #include <qstring.h>
00028 #include <vector>
00029
00030 #define ACTION_NOT_BIT 0x02000000
00031 #define ACTION_STRING_BIT 0x01000000
00032
00033 #define SPL_VALUE_NOW 0x2dae2dae2dae2daeLL
00034
00035 #define IN_THE_LAST_SECONDS 1
00036 #define IN_THE_LAST_DAYS 86400
00037 #define IN_THE_LAST_WEEKS 604800
00038
00039 namespace itunesdb {
00040
00041
00042
00043
00044
00045
00046
00047
00048 enum SPLStringField {
00049 FIELD_NAME = 0x02,
00050 FIELD_ALBUM = 0x03,
00051 FIELD_ARTIST = 0x04,
00052 FIELD_GENRE = 0x08,
00053 FIELD_KIND = 0x09,
00054 FIELD_COMMENT = 0x0e,
00055 FIELD_COMPOSER = 0x12,
00056 FIELD_GROUPING = 0x27,
00057 FIELD_DESCRIPTION = 0x36,
00058 FIELD_CATEGORY = 0x37,
00059 FIELD_TV_SHOW = 0x3E,
00060 FIELD_ALBUM_ARTIST = 0x47
00061 };
00062
00063 enum SPLUIntField {
00064 FIELD_BITRATE = 0x05,
00065 FIELD_SAMPLERATE = 0x06,
00066 FIELD_YEAR = 0x07,
00067 FIELD_DATEMODIFIED = 0x0a,
00068 FIELD_TRACKNUMBER = 0x0b,
00069 FIELD_SIZE = 0x0c,
00070 FIELD_TIME = 0x0d,
00071 FIELD_DATEADDED = 0x10,
00072 FIELD_PLAYCOUNT = 0x16,
00073 FIELD_LASTPLAYED = 0x17,
00074 FIELD_DISCNUMBER = 0x18,
00075 FIELD_RATING = 0x19,
00076 FIELD_COMPILATION = 0x1f,
00077 FIELD_BPM = 0x23,
00078 FIELD_PLAYLISTID = 0x28,
00079 FIELD_PODCAST = 0x39,
00080 FIELD_VIDEO_KIND = 0x3C,
00081 FIELD_SEASON_NR = 0x3F,
00082 FIELD_SKIP_COUNT = 0x44,
00083 FIELD_LAST_SKIPPED = 0x45
00084 };
00085
00086
00087 enum SPLStringAction {
00088 ACTION_IS_STRING = 0x01000001,
00089 ACTION_CONTAINS = 0x01000002,
00090 ACTION_STARTSWITH = 0x01000004,
00091 ACTION_ENDSWITH = 0x01000008,
00092 ACTION_IS_NOT_STRING = ACTION_IS_STRING ^ ACTION_NOT_BIT,
00093 ACTION_DOESNT_CONTAIN = ACTION_CONTAINS ^ ACTION_NOT_BIT,
00094 ACTION_DOESNT_STARTWITH = ACTION_STARTSWITH ^ ACTION_NOT_BIT,
00095 ACTION_DOESNT_ENDWITH = ACTION_ENDSWITH ^ ACTION_NOT_BIT
00096 };
00097
00098
00099 enum SPLUIntAction {
00100 ACTION_IS_UINT = 0x00000001,
00101 ACTION_GREATER_THAN = 0x00000010,
00102 ACTION_GREATER_OR_EQUAL = 0x00000020,
00103 ACTION_LESS_THAN = 0x00000040,
00104 ACTION_LESS_OR_EQUAL = 0x00000080,
00105 ACTION_IN_RANGE = 0x00000100,
00106 ACTION_IN_THE_LAST = 0x00000200,
00107 ACTION_IS_NOT_UINT = ACTION_IS_UINT ^ ACTION_NOT_BIT,
00108 ACTION_NOT_GREATER = ACTION_GREATER_THAN ^ ACTION_NOT_BIT,
00109 ACTION_NOT_GREATER_OR_EQUAL = ACTION_GREATER_OR_EQUAL ^ ACTION_NOT_BIT,
00110 ACTION_NOT_LESS = ACTION_LESS_THAN ^ ACTION_NOT_BIT,
00111 ACTION_NOT_LESS_OR_EQUAL = ACTION_LESS_OR_EQUAL ^ ACTION_NOT_BIT,
00112 ACTION_NOT_IN_RANGE = ACTION_IN_RANGE ^ ACTION_NOT_BIT,
00113 ACTION_NOT_IN_THE_LAST = ACTION_IN_THE_LAST ^ ACTION_NOT_BIT
00114 };
00115
00116
00117 enum SPLLimitSort {
00118 LIMIT_SORT_RANDOM = 0x02,
00119 LIMIT_SORT_SONG_NAME = 0x03,
00120 LIMIT_SORT_ALBUM = 0x04,
00121 LIMIT_SORT_ARTIST = 0x05,
00122 LIMIT_SORT_GENRE = 0x07,
00123 LIMIT_SORT_RECENTLYADDED = 0x10,
00124 LIMIT_SORT_PLAYCOUNT = 0x14,
00125 LIMIT_SORT_LASTPLAYED = 0x15,
00126 LIMIT_SORT_RATING = 0x17
00127 };
00128
00129
00130 enum SPLLimitType {
00131 LIMIT_TYPE_MINUTES = 1,
00132 LIMIT_TYPE_MEGABYTES = 2,
00133 LIMIT_TYPE_SONGS = 3,
00134 LIMIT_TYPE_HOURS = 4,
00135 LIMIT_TYPE_GIGABYTES = 5
00136 };
00137
00138
00139
00140
00141
00142 class SmartPlaylistRule {
00143
00144 friend class SmartPlaylistRuleSet;
00145
00146 Q_UINT32 mField;
00147 Q_UINT32 mAction;
00148
00149 const QString mString;
00150
00151 const Q_UINT64 mFromValue;
00152 const Q_UINT64 mToValue;
00153
00154 const Q_INT64 mFromDate;
00155 const Q_INT64 mToDate;
00156
00157 const Q_UINT64 mFromUnits;
00158 const Q_UINT64 mToUnits;
00159
00160 Q_UINT64 mCalculatedFrom;
00161 Q_UINT64 mCalculatedTo;
00162
00163 public:
00164
00165 virtual ~SmartPlaylistRule();
00166
00167
00168
00169
00170 Q_UINT32 getAction() const {
00171 return mAction;
00172 }
00173
00174
00175
00176
00177 Q_UINT32 getField() const {
00178 return mField;
00179 }
00180
00181
00182
00183
00184 const QString& getString() const {
00185 return mString;
00186 }
00187
00188
00189
00190
00191
00192
00193 Q_UINT64 getFromValue() const {
00194 return mFromValue;
00195 }
00196
00197
00198
00199
00200
00201
00202 Q_UINT64 getToValue() const {
00203 return mToValue;
00204 }
00205
00206
00207
00208
00209
00210
00211 Q_INT64 getFromDate() const {
00212 return mFromDate;
00213 }
00214
00215
00216
00217
00218
00219
00220 Q_INT64 getToDate() const {
00221 return mToDate;
00222 }
00223
00224
00225
00226
00227
00228 Q_UINT64 getFromUnits() const {
00229 return mFromUnits;
00230 }
00231
00232
00233
00234
00235
00236 Q_UINT64 getToUnits() const {
00237 return mToUnits;
00238 }
00239
00240
00241
00242
00243
00244 Q_UINT64 calculatedFrom() const;
00245
00246
00247
00248
00249
00250 Q_UINT64 calculatedTo() const;
00251
00252
00253
00254
00255
00256 uint writeToStream( QDataStream& outStream ) const;
00257
00258
00259
00260
00261 bool isStringBasedRule() const {
00262 return getAction() & ACTION_STRING_BIT;
00263 }
00264
00265
00266
00267
00268 virtual const QString toString() const;
00269
00270 protected:
00271
00272
00273
00274
00275 SmartPlaylistRule( SPLStringField field, SPLStringAction action, const QString& testString );
00276
00277
00278
00279
00280 SmartPlaylistRule( SPLUIntField field, SPLUIntAction action,
00281 Q_UINT64 fromValue, Q_UINT64 toValue,
00282 Q_INT64 fromDate, Q_INT64 toDate,
00283 Q_UINT64 fromUnits, Q_UINT64 toUnits );
00284
00285
00286
00287
00288
00289
00290 static QString getActionString( uint action );
00291
00292
00293
00294
00295
00296
00297 static QString getFieldString( uint field );
00298
00299
00300
00301
00302 static Q_UINT64 calculateTestValue( Q_UINT64 value, Q_INT64 date, Q_UINT64 units );
00303
00304 };
00305
00306
00307 typedef std::vector<SmartPlaylistRule*> RuleList;
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330 class SmartPlaylistRuleSet {
00331
00332 friend class Playlist;
00333
00334 public:
00335
00336 SmartPlaylistRuleSet();
00337 virtual ~SmartPlaylistRuleSet();
00338
00339
00340
00341
00342
00343
00344
00345
00346 virtual bool addStringRule( SPLStringField field,
00347 SPLStringAction action, const QString& testString, int position = -1 );
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376 virtual bool addUIntRule( SPLUIntField field, SPLUIntAction action,
00377 Q_UINT64 fromValue, Q_UINT64 toValue,
00378 Q_INT64 fromDate, Q_INT64 toDate,
00379 Q_UINT64 fromUnits, Q_UINT64 toUnits, int position = -1 );
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390 bool addUIntRule( SPLUIntField field, SPLUIntAction action,
00391 Q_UINT64 fromValue, Q_UINT64 toValue, int position = -1 ) {
00392 return addUIntRule( field, action, fromValue, toValue, 0, 0, 1, 1, position );
00393 }
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404 bool addInTheLastRule( SPLUIntField field, bool negateRule, Q_INT64 value, Q_UINT64 units, int position = -1 ) {
00405 return addUIntRule( field,
00406 negateRule ? ACTION_NOT_IN_THE_LAST : ACTION_IN_THE_LAST,
00407 SPL_VALUE_NOW, SPL_VALUE_NOW, value, 0, units, 1, position );
00408 }
00409
00410
00411
00412
00413
00414
00415
00416 const SmartPlaylistRule * getRuleAt( uint position ) {
00417 return mRules.at( position );
00418 }
00419
00420
00421
00422
00423
00424
00425
00426
00427 bool removeRuleAt( uint position );
00428
00429
00430
00431
00432 void clear();
00433
00434
00435
00436
00437
00438 bool isLiveUpdate() const {
00439 return mLiveUpdate;
00440 }
00441
00442
00443
00444
00445
00446 void setLiveUpdateFlag( bool liveupdate );
00447
00448
00449
00450
00451 bool isCheckRules() const {
00452 return mCheckRules;
00453 }
00454
00455
00456
00457
00458 void setCheckRulesFlag( bool checkRules );
00459
00460
00461
00462
00463 bool isCheckLimits() const {
00464 return mCheckLimits;
00465 }
00466
00467
00468
00469
00470 virtual void setLimits( SPLLimitSort limitSort, SPLLimitType limitType, Q_UINT32 limitValue, bool reverseLimitSort = false );
00471
00472
00473
00474
00475 void enableLimits( bool enable );
00476
00477
00478
00479
00480 SPLLimitSort getLimitSort() const {
00481 return mLimitSort;
00482 }
00483
00484
00485
00486
00487 SPLLimitType getLimitType() const {
00488 return mLimitType;
00489 }
00490
00491
00492
00493
00494 bool isMatchAny() const {
00495 return mMatchAny;
00496 }
00497
00498
00499
00500
00501 void setMatchAnyFlag( bool matchAny );
00502
00503
00504
00505
00506 bool checkedTracksOnly() const {
00507 return mCheckedOnly;
00508 }
00509
00510
00511
00512
00513
00514 void setCheckedTracksOnlyFlag( bool checkedOnly );
00515
00516
00517
00518
00519 const RuleList& getRules() const;
00520
00521
00522
00523
00524 uint getNumRules() const;
00525
00526
00527
00528
00529 QString toString() const;
00530
00531 protected:
00532
00533
00534 SmartPlaylistRuleSet( const SmartPlaylistRuleSet & src );
00535
00536
00537
00538
00539
00540
00541
00542 uint readRules( QDataStream & instream, uint length );
00543
00544
00545
00546
00547
00548
00549
00550 bool readHeader( QDataStream & instream, uint length );
00551
00552
00553
00554
00555
00556
00557 uint writeRules( QDataStream & outstream ) const;
00558
00559
00560
00561
00562
00563
00564 uint writeHeader( QDataStream & outstream ) const;
00565
00566
00567
00568
00569
00570
00571
00572 bool mMatchAny;
00573
00574 Q_UINT32 unk5;
00575
00576 Q_UINT8 mLiveUpdate;
00577 Q_UINT8 mCheckLimits;
00578 Q_UINT8 mCheckRules;
00579 Q_UINT8 mCheckedOnly;
00580 Q_UINT8 mReverseLimitSort;
00581 SPLLimitSort mLimitSort;
00582 SPLLimitType mLimitType;
00583 Q_UINT32 mLimitValue;
00584
00585
00586
00587 RuleList mRules;
00588
00589 virtual SmartPlaylistRule * createStringRule( SPLStringField field,
00590 SPLStringAction action, const QString& testString );
00591
00592 virtual SmartPlaylistRule * createUIntRule( SPLUIntField field, SPLUIntAction action,
00593 Q_UINT64 fromValue, Q_UINT64 toValue,
00594 Q_INT64 fromDate, Q_INT64 toDate,
00595 Q_UINT64 fromUnits, Q_UINT64 toUnits );
00596
00597 private:
00598
00599 SmartPlaylistRule * readSingleRule( QDataStream & instream, uint * bytesRead = NULL );
00600
00601 };
00602
00603
00604 }
00605
00606 #endif