- Timestamp:
- Dec 26, 2009, 2:14:18 AM (16 years ago)
- Location:
- trunk/src/gui/kernel
- Files:
-
- 2 edited
-
qmime.h (modified) (5 diffs)
-
qmime_pm.cpp (modified) (41 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gui/kernel/qmime.h
r439 r441 115 115 */ 116 116 117 typedef unsigned long ULONG; 117 #if !defined(QT_NO_DRAGANDDROP) 118 QT_END_NAMESPACE 119 #include "private/qpmobjectwindow_pm_p.h" 120 QT_BEGIN_NAMESPACE 121 #endif 118 122 119 123 class QPMCoopDragWorker; … … 125 129 #if !defined(QT_NO_DRAGANDDROP) 126 130 131 132 127 133 class DragWorker 128 134 { 129 135 public: 130 DragWorker() : data(0) {}136 DragWorker() : (0) {} 131 137 virtual ~DragWorker() {} 132 138 … … 177 183 { 178 184 public: 179 virtual const char *format( const char *drf) const = 0;185 virtual const ) const = 0; 180 186 virtual bool provide(const char *drf, const QByteArray &allData, 181 187 ULONG itemIndex, QByteArray &itemData) = 0; … … 246 252 247 253 static bool canRender(DRAGITEM *item, const char *drf ); 248 static bool getSupportedRMFs(DRAGITEM *item, Q PtrList<QStrList> &list);254 static bool getSupportedRMFs(DRAGITEM *item, QList> &list); 249 255 250 256 private: … … 297 303 static QByteArray querySourceNameFull(DRAGITEM *item); 298 304 static bool canTargetRenderAsOS2File(DRAGITEM *item, QByteArray *fullName = 0); 299 static bool parseRMFs(HSTR rmfs, QList<Q List<QByteArray>> &list);305 static bool parseRMFs(HSTR rmfs, QList<Q> &list); 300 306 static bool parseRMF(HSTR rmf, QByteArray &mechanism, QByteArray &format); 301 307 -
trunk/src/gui/kernel/qmime_pm.cpp
r439 r441 63 63 64 64 #ifdef QDND_DEBUG 65 65 66 # define DEBUG(a) qDebug a 66 67 #else … … 72 73 #if !defined(QT_NO_DRAGANDDROP) 73 74 74 // @todo remove 75 //#define DRT_URL "UniformResourceLocator" 76 // 77 //#define DRM_OS2FILE "DRM_OS2FILE" 78 //#define DRM_SHAREDMEM "DRM_SHAREDMEM" 79 // 80 //#define DRF_UNKNOWN "DRF_UNKNOWN" 81 //#define DRF_TEXT "DRF_TEXT" 82 //#define DRF_POINTERDATA "DRF_POINTERDATA" 83 // 84 //#define MIME_TEXT_PLAIN "text/plain" 85 //#define MIME_TEXT_PLAIN_CHARSET_SYSTEM "text/plain;charset=system" 86 //#define MIME_TEXT_URI_LIST "text/uri-list" 75 // Undoc'd DC_PREPAREITEM, see 76 // http://lxr.mozilla.org/seamonkey/source/widget/src/os2/nsDragService.cpp 77 #if !defined (DC_PREPAREITEM) 78 #define DC_PREPAREITEM 0x40 79 #endif 87 80 88 81 /*! \internal … … 241 234 ULONG index; 242 235 Provider *provider; 243 Q CStringdrm;244 Q CStringdrf;236 Q drm; 237 Q drf; 245 238 DRAGTRANSFER *xfer; 246 239 bool rendered; … … 255 248 DrfProvider() : prov(0) {} 256 249 DrfProvider(const char *d, Provider *p) : drf(d), prov(p) {} 257 constQByteArray drf;258 Provider * constprov;250 QByteArray drf; 251 Provider *prov; 259 252 }; 260 253 … … 378 371 // (however, it doesn't help when dropping objects to it -- WPS still 379 372 // chooses DRM_OS2FILE). 380 formats = "( "DRM_SHAREDMEM","DRM_OS2FILE")x(" + formats + "),"381 "< "DRM_SHAREDMEM","DRF_POINTERDATA">";373 formats = "()x(" + formats + ")," 374 "<>"; 382 375 383 376 DEBUG(() << "DefaultDragWorker: formats" << formats … … 400 393 401 394 DEBUG(() << "DefaultDragWorker: Preparing item" << itemIndex << "(id " 402 << item->ulItemID << ") for <" << drm << "," << drf ">");395 << item->ulItemID << ") for <" << drm << "," << drf ">"); 403 396 404 397 Provider *p = d->providerFor(drf); … … 469 462 << "(id " << xfer->pditem->ulItemID << ")"); 470 463 471 Q CStringdrm, drf;464 Q drm, drf; 472 465 if (!parseRMF(xfer->hstrSelectedRMF, drm, drf)) 473 466 Q_ASSERT(/* parseRMF() = */ FALSE); … … 525 518 526 519 bool renderOk = false; 527 QByteArray allData = 528 source()->encodedData(req->provider->format(req->drf));520 521 ata(req->provider->format(req->drf)); 529 522 QByteArray itemData; 530 523 … … 534 527 if (renderOk) { 535 528 enum DRM { OS2File, SharedMem } drmType; 536 if (qstrcmp(req->drm, DRM_SHAREDMEM) == 0) drmType = SharedMem;529 if (qstrcmp(req->drm, ) == 0) drmType = SharedMem; 537 530 else drmType = OS2File; 538 531 539 532 if (drmType == OS2File) { 540 Q CStringrenderToName = queryHSTR(req->xfer->hstrRenderToName);533 Q renderToName = queryHSTR(req->xfer->hstrRenderToName); 541 534 Q_ASSERT(!renderToName.isEmpty()); 542 535 renderOk = !renderToName.isEmpty(); … … 544 537 DEBUG(() << "DefaultDragWorker: Will write to" << renderToName); 545 538 QFile file(QFile::decodeName(renderToName)); 546 renderOk = file.open( IO_WriteOnly);539 renderOk = file.open(WriteOnly); 547 540 if (renderOk) { 548 Q_LONG written = 549 file.writeBlock(itemData.data(), itemData.size()); 550 renderOk = written == (Q_LONG) itemData.size() && 551 file.status() == IO_Ok; 541 qint64 written = file.write(itemData, itemData.size()); 542 renderOk = written == itemData.size(); 552 543 file.close(); 553 544 if (renderOk && req->xfer->pditem->hstrType) { … … 626 617 DEBUG(("DefaultDragWorker: Freed DRAGTRANSFER: " 627 618 "req->xfer %p size %lu (0x%08lX) flags 0x%08lX", 628 req->xfer, size, size, flags) ;619 req->xfer, size, size, flags); 629 620 } 630 621 #endif … … 686 677 // first provider 687 678 d->itemCnt = itemCnt; 688 d->providers. insert(Data::DrfProvider(drf, provider));679 d->providers.(Data::DrfProvider(drf, provider)); 689 680 return true; 690 681 } … … 693 684 // ensure there are no dups (several providers for the same drf) 694 685 if (!d->providerFor(drf)) 695 d->providers. insert(Data::DrfProvider(drf, provider));686 d->providers.(Data::DrfProvider(drf, provider)); 696 687 return true; 697 688 } … … 703 694 bool QPMMime::DefaultDragWorker::canRender(const char *drm) 704 695 { 705 return qstrcmp(drm, DRM_SHAREDMEM) == 0 ||706 qstrcmp(drm, DRM_OS2FILE) == 0;696 return qstrcmp(drm, ) == 0 || 697 qstrcmp(drm, ) == 0; 707 698 } 708 699 … … 715 706 MimeProvider() : prov(NULL) {} 716 707 MimeProvider(const QString &m, Provider *p) : mime(m), prov(p) {} 717 constQString mime;718 Provider * constprov;708 QString mime; 709 Provider *prov; 719 710 }; 720 711 … … 736 727 bool got_DM_RENDERCOMPLETE : 1; 737 728 USHORT flags_DM_RENDERCOMPLETE; 738 int waiting_DM_RENDERCOMPLETE; 729 730 QEventLoop eventLoop; 739 731 }; 740 732 … … 744 736 d->sending_DM_RENDER = d->got_DM_RENDERCOMPLETE = false; 745 737 d->flags_DM_RENDERCOMPLETE = 0; 746 d->waiting_DM_RENDERCOMPLETE = 0;747 738 } 748 739 … … 754 745 void QPMMime::DefaultDropWorker::cleanup(bool isAccepted, bool isActAccepted) 755 746 { 756 if (d-> waiting_DM_RENDERCOMPLETE != 0) {747 if (d->) { 757 748 #ifndef QT_NO_DEBUG 758 749 qWarning("The previous drag source didn't post DM_RENDERCOMPLETE!\n" 759 750 "Contact the drag source developer."); 760 751 #endif 761 qApp->eventLoop()->exitLoop();752 ); 762 753 } 763 754 … … 766 757 d->sending_DM_RENDER = d->got_DM_RENDERCOMPLETE = false; 767 758 d->flags_DM_RENDERCOMPLETE = 0; 768 d->waiting_DM_RENDERCOMPLETE = 0;769 759 } 770 760 … … 774 764 } 775 765 776 bool QPMMime::DefaultDropWorker::provides(const char *format) const 777 { 778 return d->providerFor(format) != NULL; 779 } 780 781 int QPMMime::DefaultDropWorker::formatCount() const 782 { 783 return d->providers.count(); 784 } 785 786 const char *QPMMime::DefaultDropWorker::format(int fn) const 787 { 788 if (fn >= 0 && (uint) fn < d->providers.count()) 789 return d->providers[ fn ].mime; 790 return NULL; 791 } 792 793 static QCString composeTempFileName() 794 { 795 static char defTmpDir[ 3 ] = { 0 }; 796 const char *tmpDir = getenv("TEMP"); 797 if (!tmpDir) tmpDir = getenv("TMP"); 798 if (!tmpDir || !QFile::exists(QFile::decodeName(tmpDir))) { 799 if (!defTmpDir[ 0 ]) { 800 ULONG bootDrive = 0; 801 DosQuerySysInfo(QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, 802 &bootDrive, sizeof (bootDrive)); 803 defTmpDir[ 0 ] = bootDrive; 804 defTmpDir[ 1 ] = ':'; 805 } 806 tmpDir = defTmpDir; 807 } 766 bool QPMMime::DefaultDropWorker::hasFormat(const QString &mimeType) const 767 { 768 return d->providerFor(mimeType) != NULL; 769 } 770 771 // @todo 772 //int QPMMime::DefaultDropWorker::formatCount() const 773 //{ 774 // return d->providers.count(); 775 //} 776 777 QStringList QPMMime::DefaultDropWorker::formats() const 778 { 779 QStringList mimes; 780 foreach(const Data::MimeProvider &p, d->providers) 781 mimes << p.mime; 782 return mimes; 783 } 784 785 static QByteArray composeTempFileName() 786 { 787 QByteArray tmpDir = 788 QFile::encodeName(QDir::toNativeSeparators(QDir::tempPath())); 808 789 809 790 static bool srandDone = false; … … 817 798 int attempts = Attempts; 818 799 819 Q CString tmpName;800 QString tmpName; 820 801 do { 821 tmpName.sprintf("%s\\%08lX.tmp", tmpDir , num);822 if (!QFile::exists( QFile::decodeName(tmpName)))802 tmpName.sprintf("%s\\%08lX.tmp", tmpDir, num); 803 if (!QFile::exists()) 823 804 break; 824 805 num = rand(); … … 827 808 Q_ASSERT(attempts > 0); 828 809 if (attempts <= 0) 829 tmpName.resize(0); 830 831 return tmpName; 832 } 833 834 QByteArray QPMMime::DefaultDropWorker::encodedData(const char *format) const 835 { 836 DEBUG("DefaultDropWorker::encodedData(" << format << ")"); 837 838 QByteArray data; 810 tmpName.clear(); 811 812 return QFile::encodeName(tmpName); 813 } 814 815 QVariant QPMMime::DefaultDropWorker::retrieveData(const QString &mimeType, 816 QVariant::Type type) const 817 { 818 Q_UNUSED(type); 819 820 DEBUG(() << "DefaultDropWorker::retrieveData(" << mimeType << ")"); 821 822 QVariant ret; 839 823 840 824 Q_ASSERT(info()); 841 825 if (!info()) 842 return data;826 return ; 843 827 844 828 ULONG itemCount = DrgQueryDragitemCount(info()); 845 829 Q_ASSERT(itemCount); 846 830 if (!itemCount) 847 return data;848 849 Provider *provider = d->providerFor( format);831 return ; 832 833 Provider *provider = d->providerFor(); 850 834 if (!provider) 851 return data;852 853 const char *drf = provider->drf( format);835 return ; 836 837 const char *drf = provider->drf(); 854 838 Q_ASSERT(drf); 855 839 if (!drf) 856 return data;840 return ; 857 841 858 842 // Note: Allocating and freeing DRAGTRANSFER structures is a real mess. It's … … 868 852 // always allocate a new struct per every item. It seems to work. 869 853 870 Q CStringrenderToName = composeTempFileName();854 Q renderToName = composeTempFileName(); 871 855 HSTR hstrRenderToName = DrgAddStrHandle(renderToName); 872 856 873 857 HSTR rmfOS2File = 874 DrgAddStrHandle(Q CString().sprintf("<"DRM_OS2FILE",%s>", drf));858 DrgAddStrHandle(Q)); 875 859 HSTR rmfSharedMem = 876 DrgAddStrHandle(Q CString().sprintf("<"DRM_SHAREDMEM",%s>", drf));860 DrgAddStrHandle(Q)); 877 861 878 862 MRESULT mrc; … … 880 864 881 865 DRAGTRANSFER *xfer = NULL; 882 Q CStringsrcFileName;866 Q srcFileName; 883 867 884 868 QByteArray allData, itemData; … … 897 881 // determine the mechanism to use (prefer DRM_SHAREDMEM) 898 882 899 if (DrgVerifyRMF(item, DRM_SHAREDMEM, drf) &&900 DrgVerifyRMF(item, DRM_SHAREDMEM, DRF_POINTERDATA))883 if (DrgVerifyRMF(item, , drf) && 884 DrgVerifyRMF(item, )) 901 885 drm = SharedMem; 902 if (DrgVerifyRMF(item, DRM_OS2FILE, drf)) {886 if (DrgVerifyRMF(item, , drf)) { 903 887 srcFileName = querySourceNameFull(item); 904 888 // If the source provides the full file name, we prefer DRM_OS2FILE … … 950 934 951 935 mrc = (MRESULT)TRUE; 952 if ((item->fsControl & DC_PREPARE) | 953 (item->fsControl & DC_PREPAREITEM)) {936 if ((item->fsControl & DC_PREPARE) | 937 (item->fsControl & DC_PREPAREITEM)) { 954 938 DEBUG(("DefaultDropWorker: Sending DM_RENDERPREPARE to 0x%08lX...", 955 939 info()->hwndSource)); … … 957 941 MPFROMP (xfer), 0); 958 942 DEBUG(("DefaultDropWorker: Finisned sending DM_RENDERPREPARE\n" 959 " mrc %p xfer->fsReply 0x%08hX", mrc, xfer->fsReply) ;943 " mrc %p xfer->fsReply 0x%08hX", mrc, xfer->fsReply); 960 944 renderOk = (BOOL) mrc; 961 945 } … … 979 963 } else { 980 964 // synchronously wait for DM_RENDERCOMPLETE 981 d->waiting_DM_RENDERCOMPLETE = qApp->loopLevel() + 1;982 965 DEBUG(() << "DefaultDropWorker: Waiting for DM_RENDERCOMPLETE..."); 983 int level = qApp->eventLoop()->enterLoop();966 int (); 984 967 DEBUG(("DefaultDropWorker: Finished waiting for " 985 "DM_RENDERCOMPLETE ( %d)\n"968 "DM_RENDERCOMPLETE (%d)\n" 986 969 " got_DM_RENDERCOMPLETE %d usFS 0x%hX", 987 level, d->got_DM_RENDERCOMPLETE, d->flags_DM_RENDERCOMPLETE));988 Q_UNUSED( level);970 , d->got_DM_RENDERCOMPLETE, d->flags_DM_RENDERCOMPLETE)); 971 Q_UNUSED(); 989 972 // JFTR: at this point, cleanup() might have been called, 990 973 // as a result of either program exit or getting another … … 992 975 // DM_RENDERCOMPLETE from the source. Use data members with 993 976 // care! 994 d->waiting_DM_RENDERCOMPLETE = 0;995 977 renderOk = d->got_DM_RENDERCOMPLETE && 996 978 (d->flags_DM_RENDERCOMPLETE & DMFL_RENDEROK); … … 1000 982 } 1001 983 } else { 1002 DEBUG(() << "DefaultDropWorker: Source supports < " << DRM_OS2FILE1003 << "," <<drf << "> and provides a file" << srcFileName984 DEBUG(() << "DefaultDropWorker: Source supports < 985 << drf << "> and provides a file" << srcFileName 1004 986 << "for item" << item << "(no need to render)"); 1005 987 renderOk = true; … … 1010 992 DEBUG(() << "DefaultDragWorker: Will read from" << srcFileName); 1011 993 QFile file(QFile::decodeName(srcFileName)); 1012 renderOk = file.open( IO_ReadOnly);994 renderOk = file.open(ReadOnly); 1013 995 if (renderOk) { 1014 996 itemData = file.readAll(); 1015 renderOk = file. status() == IO_Ok;997 renderOk = file.; 1016 998 file.close(); 1017 999 } … … 1030 1012 DEBUG(("DefaultDropWorker: Got shared data %p size %lu " 1031 1013 "(0x%08lX) flags 0x%08lX", ptr, size, size, flags)); 1032 Q_ASSERT( flags & (PAG_COMMIT | PAG_READ | PAG_BASE) ==1014 Q_ASSERT() == 1033 1015 (PAG_COMMIT | PAG_READ | PAG_BASE)); 1034 renderOk = flags & (PAG_COMMIT | PAG_READ | PAG_BASE) ==1016 renderOk = ) == 1035 1017 (PAG_COMMIT | PAG_READ | PAG_BASE); 1036 1018 #ifndef QT_NO_DEBUG … … 1046 1028 if (renderOk) { 1047 1029 itemData.resize(realSize); 1048 memcpy(itemData.data(), ptr + sizeof (ULONG), realSize);1030 memcpy(itemData.data(), ptr + sizeof(ULONG), realSize); 1049 1031 } 1050 1032 } … … 1058 1040 1059 1041 if (renderOk) 1060 renderOk = provider->provide( format, i, itemData, allData);1042 renderOk = provider->provide(, i, itemData, allData); 1061 1043 1062 1044 if (needToTalk) { … … 1086 1068 1087 1069 if (renderOk) 1088 data= allData;1089 1090 return data;1070 = allData; 1071 1072 return ; 1091 1073 } 1092 1074 … … 1100 1082 return (MRESULT)FALSE; 1101 1083 1102 DEBUG( "DefaultDropWorker: Got DM_RENDERCOMPLETE");1084 DEBUG(); 1103 1085 d->got_DM_RENDERCOMPLETE = true; 1104 1086 d->flags_DM_RENDERCOMPLETE = SHORT1FROMMP(mp2); … … 1117 1099 1118 1100 // stop synchronous waiting for DM_RENDERCOMPLETE 1119 if (d-> waiting_DM_RENDERCOMPLETE != 0)1120 qApp->eventLoop()->exitLoop();1101 if (d->) 1102 (); 1121 1103 return (MRESULT)FALSE; 1122 1104 } … … 1128 1110 } 1129 1111 1130 bool QPMMime::DefaultDropWorker::addProvider(const char *format,1112 bool QPMMime::DefaultDropWorker::addProvider(const , 1131 1113 Provider *provider) 1132 1114 { 1133 Q_ASSERT( format&& provider);1134 if ( format&& provider && !d->exclusive) {1115 Q_ASSERT( && provider); 1116 if ( && provider && !d->exclusive) { 1135 1117 // ensure there are no dups (several providers for the same mime) 1136 if (!d->providerFor( format))1137 d->providers. insert(Data::MimeProvider(format, provider));1118 if (!d->providerFor()) 1119 d->providers., provider)); 1138 1120 return true; 1139 1121 } … … 1141 1123 } 1142 1124 1143 bool QPMMime::DefaultDropWorker::addExclusiveProvider(const char *format,1125 bool QPMMime::DefaultDropWorker::addExclusiveProvider(const , 1144 1126 Provider *provider) 1145 1127 { 1146 Q_ASSERT( format&& provider);1147 if ( format&& provider && !d->exclusive) {1128 Q_ASSERT( && provider); 1129 if ( && provider && !d->exclusive) { 1148 1130 d->exclusive = true; 1149 1131 d->providers.clear(); 1150 d->providers. insert(Data::MimeProvider(format, provider));1132 d->providers., provider)); 1151 1133 return true; 1152 1134 } … … 1157 1139 bool QPMMime::DefaultDropWorker::canRender(DRAGITEM *item, const char *drf) 1158 1140 { 1159 return DrgVerifyRMF(item, DRM_OS2FILE, drf) || 1160 (DrgVerifyRMF(item, DRM_SHAREDMEM, drf) && 1161 DrgVerifyRMF(item, DRM_SHAREDMEM, DRF_POINTERDATA)); 1162 } 1163 1141 return DrgVerifyRMF(item, "DRM_OS2FILE", drf) || 1142 (DrgVerifyRMF(item, "DRM_SHAREDMEM", drf) && 1143 DrgVerifyRMF(item, "DRM_SHAREDMEM", "DRF_POINTERDATA")); 1144 } 1145 1146 /*! \internal 1147 1148 Parses the rendering mechanism/format specification of the given \a item 1149 and stores only those mechanism branches in the given \a list that represent 1150 mechanisms supported by this worker. Returns false if fails to parse the 1151 RMF specification. Note that if no supported mechanisms are found, true is 1152 returned but the \a list will simply contain zero items. 1153 1154 \note The method clears the given \a list variable before proceeding. 1155 1156 \sa canRender(), PMMime::parseRMFs() 1157 */ 1164 1158 // static 1165 /*! \internal1166 Parses the rendering mechanism/format specification of the given \a item1167 and stores only those mechanism branches in the given \a list that represent1168 mechanisms supported by this worker. Returns false if fails to parse the1169 RMF specification. Note that if no supported mechanisms are found, true is1170 returned but the \a list will simply contain zero items.1171 \note The method clears the given \a list variable before proceeding and sets1172 auto-deletion to true.1173 \sa canRender(), PMMime::parseRMFs()1174 */1175 1159 bool QPMMime::DefaultDropWorker::getSupportedRMFs(DRAGITEM *item, 1176 Q PtrList<QStrList> &list)1160 QList> &list) 1177 1161 { 1178 1162 if (!parseRMFs(item->hstrRMF, list)) 1179 1163 return false; 1180 1164 1181 for (QStrList *mech = list.first(); mech;) { 1182 const char *drm = mech->first(); 1183 if (qstrcmp(drm, DRM_OS2FILE) == 0) { 1184 mech = list.next(); 1165 for (QList<QByteArrayList>::iterator rmf = list.begin(); rmf != list.end();) { 1166 QByteArrayList::iterator mf = rmf->begin(); 1167 Q_ASSERT(mf != rmf->end()); 1168 const char *drm = *mf; 1169 if (qstrcmp(drm, "DRM_OS2FILE") == 0) { 1170 ++rmf; 1185 1171 continue; 1186 1172 } 1187 if (qstrcmp(drm, DRM_SHAREDMEM) == 0) { 1188 const char *drf = mech->next(); 1173 if (qstrcmp(drm, "DRM_SHAREDMEM") == 0) { 1189 1174 // accept DRM_SHAREDMEM only if there is DRF_POINTERDATA 1190 for(; drf; drf = mech->next()) { 1191 if (qstrcmp(drf, DRF_POINTERDATA) == 0) 1175 for(; mf != rmf->end(); ++mf) { 1176 const char *drf = *mf; 1177 if (qstrcmp(drf, "DRF_POINTERDATA") == 0) 1192 1178 break; 1193 1179 } 1194 if ( drf) {1195 mech = list.next();1180 if () { 1181 ; 1196 1182 continue; 1197 1183 } 1198 1184 } 1199 1185 // remove the unsupported mechanism branch from the list 1200 bool wasLast = list.getLast() == mech; 1201 list.removeRef(mech); 1202 // after deleting the last item, the current one will be set to the new 1203 // last item which was already analyzed earlier, so set to 0 to stop 1204 mech = wasLast ? 0 : list.current(); 1186 rmf = list.erase(rmf); 1205 1187 } 1206 1188 … … 1518 1500 } 1519 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1520 1795 //////////////////////////////////////////////////////////////////////////////// 1521 1796
Note:
See TracChangeset
for help on using the changeset viewer.
