00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef __DVCACHE_H
00036 #define __DVCACHE_H
00037
00038 #include "dcmtk/config/osconfig.h"
00039
00040 #include "dcmtk/ofstd/oflist.h"
00041 #include "dcmtk/ofstd/ofstring.h"
00042 #include "dcmtk/dcmqrdb/dcmqrdbi.h"
00043
00044
00045
00046
00047
00050 enum DVPSInstanceType
00051 {
00053 DVPSI_image,
00055 DVPSI_presentationState,
00057 DVPSI_structuredReport,
00059 DVPSI_storedPrint,
00061 DVPSI_hardcopyGrayscale
00062 };
00063
00064
00065
00066
00067
00068
00074 class DVInstanceCache
00075 {
00076
00077 public:
00078
00081 struct ItemStruct
00082 {
00093 ItemStruct(const OFString &uid,
00094 const int pos,
00095 const DVIFhierarchyStatus status,
00096 const DVPSInstanceType type,
00097 const int size,
00098 const OFString &filename)
00099 : UID(uid),
00100 Pos(pos),
00101 Status(status),
00102 Type(type),
00103 ImageSize(size),
00104 Filename(filename),
00105 Checked(OFFalse),
00106 Description(),
00107 Label(),
00108 List()
00109 {}
00110
00112 OFString UID;
00114 int Pos;
00116 DVIFhierarchyStatus Status;
00118 DVPSInstanceType Type;
00120 int ImageSize;
00122 OFString Filename;
00124 OFBool Checked;
00126 OFString Description;
00128 OFString Label;
00130 OFList<ItemStruct *> List;
00131 };
00132
00135 DVInstanceCache()
00136 : List(),
00137 Iterator(),
00138 OldIterator()
00139 {
00140 Iterator = OldIterator = List.end();
00141 }
00142
00145 virtual ~DVInstanceCache()
00146 {
00147 clear();
00148 }
00149
00153 inline void clear()
00154 {
00155 Iterator = List.begin();
00156 OFListIterator(ItemStruct *) last = List.end();
00157 while (Iterator != last)
00158 {
00159 delete (*Iterator);
00160 Iterator = List.erase(Iterator);
00161 }
00162 List.clear();
00163 Iterator = OldIterator = List.end();
00164 }
00165
00170 inline OFBool empty() const
00171 {
00172 return List.empty();
00173 }
00174
00179 inline Uint32 getCount() const
00180 {
00181 return List.size();
00182 }
00183
00190 inline OFBool gotoItem(Uint32 idx)
00191 {
00192 OFBool result = OFFalse;
00193 Iterator = List.begin();
00194 OFListIterator(ItemStruct *) last = List.end();
00195 while (Iterator != last)
00196 {
00197 if (idx == 0)
00198 {
00199 result = OFTrue;
00200 break;
00201 }
00202 idx--;
00203 ++Iterator;
00204 }
00205 return result;
00206 }
00207
00212 inline OFBool gotoFirst()
00213 {
00214 OldIterator = Iterator;
00215 Iterator = List.begin();
00216 return (Iterator != List.end());
00217 }
00218
00223 inline OFBool gotoNext()
00224 {
00225 OFListIterator(ItemStruct *) last = List.end();
00226 if (Iterator != last)
00227 Iterator++;
00228 return (Iterator != last);
00229 }
00230
00236 inline OFBool reset()
00237 {
00238 OFBool result = OFFalse;
00239 OFListIterator(ItemStruct *) last = List.end();
00240 if (OldIterator != last)
00241 {
00242 Iterator = OldIterator;
00243 OldIterator = last;
00244 result = OFTrue;
00245 }
00246 return result;
00247 }
00248
00255 inline OFBool isElem(const OFString &uid)
00256 {
00257 OFBool result = OFFalse;
00258 Iterator = List.begin();
00259 OFListIterator(ItemStruct *) last = List.end();
00260 while (Iterator != last)
00261 {
00262 const ItemStruct *item = (*Iterator);
00263 if (item != NULL)
00264 {
00265 if (item->UID == uid)
00266 {
00267 result = OFTrue;
00268 break;
00269 }
00270 }
00271 ++Iterator;
00272 }
00273 return result;
00274 }
00275
00280 inline int getPos() const
00281 {
00282 const ItemStruct *item = getItem();
00283 return (item != NULL) ? item->Pos : 0;
00284 }
00285
00290 inline DVIFhierarchyStatus getStatus() const
00291 {
00292 const ItemStruct *item = getItem();
00293 return (item != NULL) ? item->Status : DVIF_objectIsNew;
00294 }
00295
00300 inline DVPSInstanceType getType() const
00301 {
00302 const ItemStruct *item = getItem();
00303 return (item != NULL) ? item->Type : DVPSI_image;
00304 }
00305
00310 inline int getImageSize() const
00311 {
00312 const ItemStruct *item = getItem();
00313 return (item != NULL) ? item->ImageSize : 0;
00314 }
00315
00320 inline const char *getFilename() const
00321 {
00322 const ItemStruct *item = getItem();
00323 return (item != NULL) ? item->Filename.c_str() : (const char *)NULL;
00324 }
00325
00330 inline ItemStruct *getItem() const
00331 {
00332 return (Iterator != List.end()) ? (*Iterator) : (ItemStruct *)NULL;
00333 }
00334
00345 inline void addItem(const OFString &uid,
00346 const int pos,
00347 const DVIFhierarchyStatus status,
00348 const DVPSInstanceType type,
00349 const int size,
00350 const OFString &filename)
00351 {
00352 ItemStruct *item = new ItemStruct(uid, pos, status, type, size, filename);
00353 List.push_back(item);
00354 Iterator = --List.end();
00355 }
00356
00361 inline DVIFhierarchyStatus updateStatus()
00362 {
00363 OFListIterator(ItemStruct *) first = List.begin();
00364 OFListIterator(ItemStruct *) last = List.end();
00365 OFListIterator(ItemStruct *) iter = first;
00366 DVIFhierarchyStatus status = DVIF_objectIsNew;
00367 while (iter != last)
00368 {
00369 ItemStruct *item = (*iter);
00370 if (item != NULL)
00371 {
00372 switch (item->Status)
00373 {
00374 case DVIF_objectIsNew:
00375 if (status == DVIF_objectIsNotNew)
00376 status = DVIF_objectContainsNewSubobjects;
00377 break;
00378 case DVIF_objectIsNotNew:
00379 case DVIF_objectContainsNewSubobjects:
00380 if (iter == first)
00381 status = DVIF_objectIsNotNew;
00382 else if (status == DVIF_objectIsNew)
00383 status = DVIF_objectContainsNewSubobjects;
00384 break;
00385 }
00386 }
00387 ++iter;
00388 }
00389 return status;
00390 }
00391
00392
00393 protected:
00394
00396 OFList<ItemStruct *> List;
00398 OFListIterator(ItemStruct *) Iterator;
00400 OFListIterator(ItemStruct *) OldIterator;
00401 };
00402
00403
00404
00405
00406
00412 class DVSeriesCache
00413 {
00414
00415 public:
00416
00419 struct ItemStruct
00420 {
00428 ItemStruct(const OFString &uid,
00429 const DVIFhierarchyStatus status = DVIF_objectIsNew,
00430 const DVPSInstanceType type = DVPSI_image)
00431 : UID(uid),
00432 Status(status),
00433 Type(type),
00434 List()
00435 {}
00436
00438 OFString UID;
00440 DVIFhierarchyStatus Status;
00442 DVPSInstanceType Type;
00444 DVInstanceCache List;
00445 };
00446
00449 DVSeriesCache()
00450 : List(),
00451 Iterator(),
00452 OldIterator()
00453 {
00454 Iterator = OldIterator = List.end();
00455 }
00456
00459 virtual ~DVSeriesCache()
00460 {
00461 clear();
00462 }
00463
00467 inline void clear()
00468 {
00469 Iterator = List.begin();
00470 OFListIterator(ItemStruct *) last = List.end();
00471 while (Iterator != last)
00472 {
00473 delete (*Iterator);
00474 Iterator = List.erase(Iterator);
00475 }
00476 List.clear();
00477 Iterator = OldIterator = List.end();
00478 }
00479
00484 inline OFBool empty() const
00485 {
00486 return List.empty();
00487 }
00488
00493 inline Uint32 getCount() const
00494 {
00495 return List.size();
00496 }
00497
00504 inline OFBool gotoItem(Uint32 idx)
00505 {
00506 OFBool result = OFFalse;
00507 Iterator = List.begin();
00508 OFListIterator(ItemStruct *) last = List.end();
00509 while (Iterator != last)
00510 {
00511 if (idx == 0)
00512 {
00513 result = OFTrue;
00514 break;
00515 }
00516 idx--;
00517 ++Iterator;
00518 }
00519 return result;
00520 }
00521
00526 inline OFBool gotoFirst()
00527 {
00528 OldIterator = Iterator;
00529 Iterator = List.begin();
00530 return (Iterator != List.end());
00531 }
00532
00537 inline OFBool gotoNext()
00538 {
00539 OFListIterator(ItemStruct *) last = List.end();
00540 if (Iterator != last)
00541 Iterator++;
00542 return (Iterator != last);
00543 }
00544
00550 inline OFBool reset()
00551 {
00552 OFBool result = OFFalse;
00553 OFListIterator(ItemStruct *) last = List.end();
00554 if (OldIterator != last)
00555 {
00556 Iterator = OldIterator;
00557 OldIterator = last;
00558 result = OFTrue;
00559 }
00560 return result;
00561 }
00562
00569 inline OFBool isElem(const OFString &uid)
00570 {
00571 OFBool result = OFFalse;
00572 Iterator = List.begin();
00573 OFListIterator(ItemStruct *) last = List.end();
00574 while (Iterator != last)
00575 {
00576 const ItemStruct *item = (*Iterator);
00577 if (item != NULL)
00578 {
00579 if (item->UID == uid)
00580 {
00581 result = OFTrue;
00582 break;
00583 }
00584 }
00585 ++Iterator;
00586 }
00587 return result;
00588 }
00589
00594 inline DVIFhierarchyStatus getStatus() const
00595 {
00596 const ItemStruct *item = getItem();
00597 return (item != NULL) ? item->Status : DVIF_objectIsNew;
00598 }
00599
00604 inline DVPSInstanceType getType() const
00605 {
00606 const ItemStruct *item = getItem();
00607 return (item != NULL) ? item->Type : DVPSI_image;
00608 }
00609
00614 inline ItemStruct *getItem() const
00615 {
00616 return (Iterator != List.end()) ? (*Iterator) : (ItemStruct *)NULL;
00617 }
00618
00625 inline void addItem(const OFString &uid,
00626 const DVIFhierarchyStatus status = DVIF_objectIsNew)
00627 {
00628 ItemStruct *item = new ItemStruct(uid, status);
00629 List.push_back(item);
00630 Iterator = --List.end();
00631 }
00632
00637 inline DVIFhierarchyStatus updateStatus()
00638 {
00639 OFListIterator(ItemStruct *) first = List.begin();
00640 OFListIterator(ItemStruct *) last = List.end();
00641 OFListIterator(ItemStruct *) iter = first;
00642 DVIFhierarchyStatus status = DVIF_objectIsNew;
00643 while (iter != last)
00644 {
00645 ItemStruct *item = (*iter);
00646 if (item != NULL)
00647 {
00648 item->Status = item->List.updateStatus();
00649 switch (item->Status)
00650 {
00651 case DVIF_objectIsNew:
00652 if (status == DVIF_objectIsNotNew)
00653 status = DVIF_objectContainsNewSubobjects;
00654 break;
00655 case DVIF_objectIsNotNew:
00656 if (iter == first)
00657 status = DVIF_objectIsNotNew;
00658 else if (status == DVIF_objectIsNew)
00659 status = DVIF_objectContainsNewSubobjects;
00660 break;
00661 case DVIF_objectContainsNewSubobjects:
00662 status = DVIF_objectContainsNewSubobjects;
00663 break;
00664 }
00665 }
00666 ++iter;
00667 }
00668 return status;
00669 }
00670
00671
00672 protected:
00673
00675 OFList<ItemStruct *> List;
00677 OFListIterator(ItemStruct *) Iterator;
00679 OFListIterator(ItemStruct *) OldIterator;
00680 };
00681
00682
00683
00684
00685
00691 class DVStudyCache
00692 {
00693
00694 public:
00695
00698 struct ItemStruct
00699 {
00706 ItemStruct(const OFString &uid,
00707 const DVIFhierarchyStatus status = DVIF_objectIsNew)
00708 : UID(uid),
00709 Status(status),
00710 List()
00711 {}
00712
00714 OFString UID;
00716 DVIFhierarchyStatus Status;
00718 DVSeriesCache List;
00719 };
00720
00723 DVStudyCache()
00724 : List(),
00725 Iterator()
00726 {
00727 Iterator = List.end();
00728 }
00729
00732 virtual ~DVStudyCache()
00733 {
00734 clear();
00735 }
00736
00740 inline void clear()
00741 {
00742 Iterator = List.begin();
00743 OFListIterator(ItemStruct *) last = List.end();
00744 while (Iterator != last)
00745 {
00746 delete (*Iterator);
00747 Iterator = List.erase(Iterator);
00748 }
00749 List.clear();
00750 Iterator = List.end();
00751 }
00752
00757 inline OFBool empty() const
00758 {
00759 return List.empty();
00760 }
00761
00766 inline Uint32 getCount() const
00767 {
00768 return List.size();
00769 }
00770
00777 inline OFBool gotoItem(Uint32 idx)
00778 {
00779 OFBool result = OFFalse;
00780 Iterator = List.begin();
00781 OFListIterator(ItemStruct *) last = List.end();
00782 while (Iterator != last)
00783 {
00784 if (idx == 0)
00785 {
00786 result = OFTrue;
00787 break;
00788 }
00789 idx--;
00790 ++Iterator;
00791 }
00792 return result;
00793 }
00794
00799 inline OFBool gotoFirst()
00800 {
00801
00802 Iterator = List.begin();
00803 return (Iterator != List.end());
00804 }
00805
00810 inline OFBool gotoNext()
00811 {
00812 OFListIterator(ItemStruct *) last = List.end();
00813 if (Iterator != last)
00814 Iterator++;
00815 return (Iterator != last);
00816 }
00817
00824 inline OFBool isElem(const OFString &uid)
00825 {
00826 OFBool result = OFFalse;
00827 Iterator = List.begin();
00828 OFListIterator(ItemStruct *) last = List.end();
00829 while (Iterator != last)
00830 {
00831 const ItemStruct *item = (*Iterator);
00832 if (item != NULL)
00833 {
00834 if (item->UID == uid)
00835 {
00836 result= OFTrue;
00837 break;
00838 }
00839 }
00840 ++Iterator;
00841 }
00842 return result;
00843 }
00844
00849 inline DVIFhierarchyStatus getStatus() const
00850 {
00851 const ItemStruct *item = getItem();
00852 return (item != NULL) ? item->Status : DVIF_objectIsNew;
00853 }
00854
00859 inline ItemStruct *getItem() const
00860 {
00861 return (Iterator != List.end()) ? (*Iterator) : (ItemStruct *)NULL;
00862 }
00863
00870 inline void addItem(const OFString &uid,
00871 const DVIFhierarchyStatus status = DVIF_objectIsNew)
00872 {
00873 ItemStruct *item = new ItemStruct(uid, status);
00874 List.push_back(item);
00875 Iterator = --List.end();
00876 }
00877
00882 inline void updateStatus()
00883 {
00884 OFListIterator(ItemStruct *) iter = List.begin();
00885 OFListIterator(ItemStruct *) last = List.end();
00886 while (iter != last)
00887 {
00888 ItemStruct *item = (*iter);
00889 if (item != NULL)
00890 item->Status = item->List.updateStatus();
00891 ++iter;
00892 }
00893 }
00894
00895
00896 protected:
00897
00899 OFList<ItemStruct *> List;
00901 OFListIterator(ItemStruct *) Iterator;
00902 };
00903
00904
00905 #endif
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971