- Timestamp:
- Feb 19, 2010, 12:29:57 AM (15 years ago)
- Location:
- trunk/src/gui/kernel
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gui/kernel/qdnd_pm.cpp
r564 r580 58 58 59 59 #include "qt_os2.h" 60 #include "private/qpmobjectwindow_pm_p.h" 60 61 61 62 //#define QDND_DEBUG // in pair with qmime_pm.cpp -
trunk/src/gui/kernel/qmime.h
r561 r580 115 115 */ 116 116 117 QT_END_NAMESPACE 118 #include "qt_os2.h" 119 #if !defined(QT_NO_DRAGANDDROP) 120 # include "private/qpmobjectwindow_pm_p.h" 121 #endif 122 QT_BEGIN_NAMESPACE 117 QT_BEGIN_INCLUDE_NAMESPACE 118 119 #include "qwindowdefs_pm.h" 120 typedef LHANDLE HSTR; 121 typedef struct _DRAGINFO DRAGINFO; 122 typedef struct _DRAGITEM DRAGITEM; 123 124 QT_END_INCLUDE_NAMESPACE 123 125 124 126 class QPMDragData; … … 162 164 }; 163 165 164 class DefaultDragWorker : public DragWorker , public QPMObjectWindow166 class DefaultDragWorker : public DragWorker 165 167 { 166 168 private: … … 173 175 bool isExclusive() const; 174 176 ULONG itemCount() const; 175 HWND hwnd() const { return QPMObjectWindow::hwnd(); }177 HWND hwnd() const; 176 178 QByteArray composeFormatString(); 177 179 bool prepare(const char *drm, const char *drf, DRAGITEM *item, 178 180 ULONG itemIndex); 179 181 void defaultFileType(QString &type, QString &ext); 180 181 // QPMObjectWindow interface182 MRESULT message(ULONG msg, MPARAM mp1, MPARAM mp2);183 182 184 183 class Provider … … 224 223 }; 225 224 226 class DefaultDropWorker : public DropWorker , public QPMObjectWindow225 class DefaultDropWorker : public DropWorker 227 226 { 228 227 private: … … 238 237 QVariant retrieveData(const QString &mimeType, 239 238 QVariant::Type preferredType) const; 240 241 // QPMObjectWindow interface242 MRESULT message(ULONG msg, MPARAM mp1, MPARAM mp2);243 239 244 240 class Provider -
trunk/src/gui/kernel/qmime_pm.cpp
r564 r580 60 60 #include "qdir.h" 61 61 62 #include "qt_os2.h" 63 #include "private/qpmobjectwindow_pm_p.h" 64 62 65 //#define QDND_DEBUG // in pair with qdnd_pm.cpp 63 66 … … 215 218 //------------------------------------------------------------------------------ 216 219 217 struct QPMMime::DefaultDragWorker::Data 218 { 219 Data( bool excl) :exclusive(excl) {}220 struct QPMMime::DefaultDragWorker::Data : public QPMObjectWindow 221 { 222 Data(DefaultDragWorker *worker, bool excl) : q(worker), exclusive(excl) {} 220 223 221 224 struct Request … … 245 248 void cleanupRequests(); 246 249 250 // QPMObjectWindow interface 251 MRESULT message(ULONG msg, MPARAM mp1, MPARAM mp2); 252 247 253 struct DrfProvider 248 254 { … … 263 269 } 264 270 271 DefaultDragWorker *q; 272 265 273 const bool exclusive : 1; 266 274 DrfProviderList providers; … … 283 291 284 292 QPMMime::DefaultDragWorker::DefaultDragWorker(bool exclusive) 285 : d(new Data( exclusive))293 : d(new Data(this, exclusive)) 286 294 { 287 295 d->itemCnt = 0; … … 341 349 { 342 350 return d->itemCnt; 351 } 352 353 ULONG QPMMime::DefaultDragWorker::hwnd() const 354 { 355 return d->hwnd(); 343 356 } 344 357 … … 433 446 } 434 447 435 MRESULT QPMMime::DefaultDragWorker:: message(ULONG msg, MPARAM mp1, MPARAM mp2)448 MRESULT QPMMime::DefaultDragWorker::Data::message(ULONG msg, MPARAM mp1, MPARAM mp2) 436 449 { 437 450 if (msg == DM_RENDER) { … … 439 452 440 453 // sanity checks 441 Q_ASSERT( d->isInitialized());454 Q_ASSERT(isInitialized()); 442 455 Q_ASSERT(xfer); 443 if (! d->isInitialized() || !xfer)456 if (!isInitialized() || !xfer) 444 457 return (MRESULT)FALSE; 445 458 … … 448 461 return (MRESULT)FALSE; 449 462 450 Data::Request *req = d->requests.value(xfer->pditem->ulItemID);463 Data::Request *req = requests.value(xfer->pditem->ulItemID); 451 464 452 465 // check that this item has been prepared (should always be the case … … 491 504 if (msg == WM_USER) { 492 505 // sanity checks 493 Q_ASSERT( d->isInitialized());494 if (! d->isInitialized())506 Q_ASSERT(isInitialized()); 507 if (!isInitialized()) 495 508 return (MRESULT)FALSE; 496 509 … … 498 511 499 512 // sanity checks 500 Data::Request *req = d->requests.value(itemId);513 Data::Request *req = requests.value(itemId); 501 514 Q_ASSERT(req); // prepared 502 515 Q_ASSERT(req->xfer != NULL); // DM_RENDER requested … … 507 520 return (MRESULT)FALSE; 508 521 509 Q_ASSERT( source() && req->provider && req->index < d->itemCnt);510 if (! source() || !req->provider || req->index >= d->itemCnt)522 Q_ASSERT(q->source() && req->provider && req->index < itemCnt); 523 if (!q->source() || !req->provider || req->index >= itemCnt) 511 524 return (MRESULT)FALSE; 512 525 … … 516 529 << "drf" << req->drf.data()); 517 530 518 bool renderOk = false;519 520 QByteArray allData = source()->data(req->provider->format(req->drf));531 bool ok = false; 532 533 QByteArray allData = q->source()->data(req->provider->format(req->drf)); 521 534 QByteArray itemData; 522 535 523 renderOk = req->provider->provide(req->drf, allData, 524 req->index, itemData); 525 526 if (renderOk) { 536 ok = req->provider->provide(req->drf, allData, req->index, itemData); 537 538 if (ok) { 527 539 enum DRM { OS2File, SharedMem } drmType; 528 540 if (qstrcmp(req->drm, "DRM_SHAREDMEM") == 0) drmType = SharedMem; … … 532 544 QByteArray renderToName = queryHSTR(req->xfer->hstrRenderToName); 533 545 Q_ASSERT(!renderToName.isEmpty()); 534 renderOk = !renderToName.isEmpty();535 if ( renderOk) {546 ok = !renderToName.isEmpty(); 547 if (ok) { 536 548 DEBUG(() << "DefaultDragWorker: Will write to" << renderToName); 537 549 QFile file(QFile::decodeName(renderToName)); 538 renderOk = file.open(QIODevice::WriteOnly);539 if ( renderOk) {550 ok = file.open(QIODevice::WriteOnly); 551 if (ok) { 540 552 qint64 written = file.write(itemData, itemData.size()); 541 renderOk = written == itemData.size();553 ok = written == itemData.size(); 542 554 file.close(); 543 if ( renderOk && req->xfer->pditem->hstrType) {555 if (ok && req->xfer->pditem->hstrType) { 544 556 // since WPS ignores hstrType, write it manually 545 557 // to the .TYPE EA of the created file … … 553 565 TID tid; 554 566 bool isSameProcess = false; 555 renderOk = WinQueryWindowProcess(req->xfer->hwndClient, 556 &pid, &tid); 557 if (renderOk) { 567 ok = WinQueryWindowProcess(req->xfer->hwndClient, &pid, &tid); 568 if (ok) { 558 569 PPIB ppib = NULL; 559 570 DosGetInfoBlocks(NULL, &ppib); … … 568 579 OBJ_GIVEABLE | PAG_COMMIT | 569 580 PAG_READ | PAG_WRITE); 570 renderOk = rc == 0;571 if ( renderOk && !isSameProcess) {581 ok = rc == 0; 582 if (ok && !isSameProcess) { 572 583 rc = DosGiveSharedMem(ptr, pid, PAG_READ); 573 renderOk = rc == 0;584 ok = rc == 0; 574 585 } 575 if ( renderOk) {586 if (ok) { 576 587 *(ULONG *) ptr = itemData.size(); 577 588 memcpy(ptr + sizeof (ULONG), itemData.data(), … … 598 609 req->rendered = true; 599 610 // cumulative render result 600 d->renderOk &= renderOk;601 602 DEBUG(() << "DefaultDragWorker: renderOk" << renderOk603 << "overall.renderOk" << d->renderOk);611 renderOk &= ok; 612 613 DEBUG(() << "DefaultDragWorker: ok" << ok 614 << "overall.renderOk" << renderOk); 604 615 605 616 // note that we don't allow the target to retry 606 USHORT reply = renderOk ? DMFL_RENDEROK : DMFL_RENDERFAIL;617 USHORT reply = ok ? DMFL_RENDEROK : DMFL_RENDERFAIL; 607 618 DrgPostTransferMsg(req->xfer->hwndClient, DM_RENDERCOMPLETE, 608 619 req->xfer, reply, 0, false); … … 633 644 634 645 // sanity check (don't assert, see above) 635 Data::Request *req = d->requests.value(itemId);646 Data::Request *req = requests.value(itemId); 636 647 Q_ASSERT(req); 637 648 if (!req) … … 641 652 << "(id " << itemId << ") provider" << req->provider 642 653 << "drm" << req->drm << "drf" << req->drf 643 << "rendered" << req->rendered << "outdated" << ! d->isInitialized());654 << "rendered" << req->rendered << "outdated" << !isInitialized()); 644 655 645 656 // proceed further only if it's not an outdated request 646 657 // from the previous DND session 647 if ( d->isInitialized()) {658 if (isInitialized()) { 648 659 if (!req->rendered) { 649 660 // we treat cancelling the render request (for any reason) 650 661 // as a failure 651 d->renderOk = false;662 renderOk = false; 652 663 } else { 653 664 // the overall success is true only if target says Okay 654 d->renderOk &= flags == DMFL_TARGETSUCCESSFUL;665 renderOk &= flags == DMFL_TARGETSUCCESSFUL; 655 666 } 656 667 } 657 668 658 669 // delete the request 659 delete d->requests.take(itemId);670 delete requests.take(itemId); 660 671 661 672 return (MRESULT)FALSE; … … 699 710 //------------------------------------------------------------------------------ 700 711 701 struct QPMMime::DefaultDropWorker::Data 712 struct QPMMime::DefaultDropWorker::Data : public QPMObjectWindow 702 713 { 703 714 struct MimeProvider … … 709 720 }; 710 721 722 Data(DefaultDropWorker *worker) : q(worker) {} 723 724 // QPMObjectWindow interface 725 MRESULT message(ULONG msg, MPARAM mp1, MPARAM mp2); 726 711 727 typedef QList<MimeProvider> MimeProviderList; 712 728 … … 720 736 } 721 737 738 DefaultDropWorker *q; 739 722 740 bool exclusive : 1; 723 741 MimeProviderList providers; … … 730 748 }; 731 749 732 QPMMime::DefaultDropWorker::DefaultDropWorker() : d(new Data( ))750 QPMMime::DefaultDropWorker::DefaultDropWorker() : d(new Data(this)) 733 751 { 734 752 d->exclusive = false; … … 917 935 918 936 xfer->cb = sizeof(DRAGTRANSFER); 919 xfer->hwndClient = hwnd();937 xfer->hwndClient = d->hwnd(); 920 938 xfer->ulTargetInfo = (ULONG) info(); 921 939 xfer->usOperation = info()->usOperation; … … 1077 1095 } 1078 1096 1079 MRESULT QPMMime::DefaultDropWorker:: message(ULONG msg, MPARAM mp1, MPARAM mp2)1097 MRESULT QPMMime::DefaultDropWorker::Data::message(ULONG msg, MPARAM mp1, MPARAM mp2) 1080 1098 { 1081 1099 switch (msg) { 1082 1100 case DM_RENDERCOMPLETE: { 1083 1101 // sanity check 1084 Q_ASSERT( info());1085 if (! info())1102 Q_ASSERT(q->info()); 1103 if (!q->info()) 1086 1104 return (MRESULT)FALSE; 1087 1105 1088 1106 DEBUG(("DefaultDropWorker: Got DM_RENDERCOMPLETE")); 1089 d->got_DM_RENDERCOMPLETE = true;1090 d->flags_DM_RENDERCOMPLETE = SHORT1FROMMP(mp2);1091 1092 if ( d->sending_DM_RENDER)1107 got_DM_RENDERCOMPLETE = true; 1108 flags_DM_RENDERCOMPLETE = SHORT1FROMMP(mp2); 1109 1110 if (sending_DM_RENDER) 1093 1111 { 1094 1112 #ifndef QT_NO_DEBUG … … 1103 1121 1104 1122 // stop synchronous waiting for DM_RENDERCOMPLETE 1105 if ( d->eventLoop.isRunning())1106 d->eventLoop.exit();1123 if (eventLoop.isRunning()) 1124 eventLoop.exit(); 1107 1125 return (MRESULT)FALSE; 1108 1126 } -
trunk/src/gui/kernel/qwindowdefs_pm.h
r564 r580 56 56 QT_END_NAMESPACE 57 57 58 // typedefs to avoid inclusion of qt_os2.h in public headers 58 // common typedefs from os2.h to avoid inclusion of qt_os2.h in public headers 59 typedef unsigned long ULONG; 60 typedef unsigned short USHORT; 59 61 typedef unsigned long LHANDLE; 60 62 typedef LHANDLE HWND;
Note:
See TracChangeset
for help on using the changeset viewer.