comparison OrthancServer/FromDcmtkBridge.cpp @ 2207:6dc3bdb4088b

Fix handling of encodings in C-FIND for worklists
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 09 Dec 2016 11:24:04 +0100
parents 84d1d392a9ab
children e3fd5bc429a2
comparison
equal deleted inserted replaced
2206:27106f7e3759 2207:6dc3bdb4088b
1895 } 1895 }
1896 1896
1897 target.SetValue(ParseTag(members[i]), value.asString(), false); 1897 target.SetValue(ParseTag(members[i]), value.asString(), false);
1898 } 1898 }
1899 } 1899 }
1900
1901
1902 void FromDcmtkBridge::ChangeStringEncoding(DcmItem& dataset,
1903 Encoding source,
1904 Encoding target)
1905 {
1906 // Recursive exploration of a dataset to change the encoding of
1907 // each string-like element
1908
1909 if (source == target)
1910 {
1911 return;
1912 }
1913
1914 for (unsigned long i = 0; i < dataset.card(); i++)
1915 {
1916 DcmElement* element = dataset.getElement(i);
1917 if (element)
1918 {
1919 if (element->isLeaf())
1920 {
1921 char *c = NULL;
1922 if (element->isaString() &&
1923 element->getString(c).good() &&
1924 c != NULL)
1925 {
1926 std::string a = Toolbox::ConvertToUtf8(c, source);
1927 std::string b = Toolbox::ConvertFromUtf8(a, target);
1928 element->putString(b.c_str());
1929 }
1930 }
1931 else
1932 {
1933 // "All subclasses of DcmElement except for DcmSequenceOfItems
1934 // are leaf nodes, while DcmSequenceOfItems, DcmItem, DcmDataset
1935 // etc. are not." The following dynamic_cast is thus OK.
1936 DcmSequenceOfItems& sequence = dynamic_cast<DcmSequenceOfItems&>(*element);
1937
1938 for (unsigned long j = 0; j < sequence.card(); j++)
1939 {
1940 ChangeStringEncoding(*sequence.getItem(j), source, target);
1941 }
1942 }
1943 }
1944 }
1945 }
1900 } 1946 }