+ // Create a new seqEntry if necessary
+ if ( !seqEntry )
+ {
+ seqEntry = NewSeqEntry(group, elem);
+
+ if ( !AddEntry(seqEntry) )
+ {
+ gdcmWarningMacro( "AddEntry failed although this is a creation for ("
+ <<std::hex << group << "|" << elem <<")" );
+ seqEntry->Delete();
+ return NULL;
+ }
+ seqEntry->Delete();
+ }
+ // Remark :
+ // SequenceDelimitationItem will be added at the end of the SeqEntry,
+ // at write time
+ return seqEntry;
+}
+
+/**
+ * \brief Checks if a given Dicom Element exists within the DocEntrySet
+ * @param group Group number of the searched Dicom Element
+ * @param elem Element number of the searched Dicom Element
+ * @return true is found
+ */
+bool DocEntrySet::CheckIfEntryExist(uint16_t group, uint16_t elem )
+{
+ return GetDocEntry(group,elem)!=NULL;
+}
+
+/**
+ * \brief Build a new DataEntry from all the low level arguments.
+ * Check for existence of dictionary entry, and build
+ * a default one when absent.
+ * @param group Group number of the new Entry
+ * @param elem Element number of the new Entry
+ * @param vr V(alue) R(epresentation) of the new Entry
+ * \remarks The user of this method must destroy the DataEntry when unused
+ */
+DataEntry *DocEntrySet::NewDataEntry(uint16_t group,uint16_t elem,
+ VRKey const &vr)
+{
+ DictEntry *dictEntry = GetDictEntry(group, elem, vr);
+
+ DataEntry *newEntry = DataEntry::New(dictEntry);
+ dictEntry->Unregister(); // GetDictEntry register it
+ if (!newEntry)
+ {
+ gdcmWarningMacro( "Failed to allocate DataEntry for ("
+ <<std::hex << group << "|" << elem <<")" );
+ return 0;
+ }
+ return newEntry;
+}
+
+/**
+ * \brief Build a new SeqEntry from all the low level arguments.
+ * Check for existence of dictionary entry, and build
+ * a default one when absent.
+ * @param group Group number of the new Entry
+ * @param elem Element number of the new Entry
+ * \remarks The user of this method must destroy the SeqEntry when unused
+ */
+SeqEntry* DocEntrySet::NewSeqEntry(uint16_t group, uint16_t elem)
+{
+ DictEntry *dictEntry = GetDictEntry(group, elem, "SQ");
+
+ SeqEntry *newEntry = SeqEntry::New( dictEntry );
+ dictEntry->Unregister(); // GetDictEntry register it
+ if (!newEntry)
+ {
+ gdcmWarningMacro( "Failed to allocate SeqEntry for ("
+ <<std::hex << group << "|" << elem <<")" );
+ return 0;
+ }
+ return newEntry;
+}
+
+//-----------------------------------------------------------------------------
+// Protected
+/**
+ * \brief Searches [both] the public [and the shadow dictionary (when they
+ * exist)] for the presence of the DictEntry with given
+ * group and element. The public dictionary has precedence on the
+ * shadow one(s), if any.
+ * @param group Group number of the searched DictEntry
+ * @param elem Element number of the searched DictEntry
+ * @return Corresponding DictEntry when it exists, NULL otherwise.
+ * \remarks The returned DictEntry is registered when existing
+ */
+DictEntry *DocEntrySet::GetDictEntry(uint16_t group,uint16_t elem)
+{
+ DictEntry *found = 0;
+ Dict *pubDict = Global::GetDicts()->GetDefaultPubDict();
+ if (!pubDict)
+ {
+ gdcmWarningMacro( "We SHOULD have a default dictionary");
+ }
+ else