1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
/*=========================================================================
Program: GDCM (Grassroots DICOM). A DICOM library
Copyright (c) 2006-2011 Mathieu Malaterre
All rights reserved.
See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#include "gdcmRoleSelectionSub.h"
#include "gdcmFileMetaInformation.h"
#include "gdcmSwapper.h"
namespace gdcm
{
namespace network
{
const uint8_t RoleSelectionSub::ItemType = 0x54;
const uint8_t RoleSelectionSub::Reserved2 = 0x00;
RoleSelectionSub::RoleSelectionSub()
{
ItemLength = 0;
UIDLength = 0;
SCURole = 0;
SCPRole = 0;
ItemLength = (uint16_t)(Size() - 4);
assert( (size_t)ItemLength + 4 == Size() );
}
std::istream &RoleSelectionSub::Read(std::istream &is)
{
//uint8_t itemtype = 0x0;
//is.read( (char*)&itemtype, sizeof(ItemType) );
//assert( itemtype == ItemType );
uint8_t reserved2;
is.read( (char*)&reserved2, sizeof(Reserved2) );
uint16_t itemlength;
is.read( (char*)&itemlength, sizeof(ItemLength) );
SwapperDoOp::SwapArray(&itemlength,1);
ItemLength = itemlength;
uint16_t uidlength;
is.read( (char*)&uidlength, sizeof(UIDLength) );
SwapperDoOp::SwapArray(&uidlength,1);
UIDLength = uidlength;
char name[256];
assert( uidlength < 256 );
is.read( name, uidlength );
Name = std::string(name,uidlength);
uint8_t scurole;
is.read( (char*)&scurole, sizeof(SCURole) );
SCURole = scurole;
uint8_t scprole;
is.read( (char*)&scprole, sizeof(SCPRole) );
SCPRole = scprole;
assert( (size_t)ItemLength + 4 == Size() );
return is;
}
const std::ostream &RoleSelectionSub::Write(std::ostream &os) const
{
assert( (size_t)ItemLength + 4 == Size() );
os.write( (char*)&ItemType, sizeof(ItemType) );
os.write( (char*)&Reserved2, sizeof(Reserved2) );
//os.write( (char*)&ItemLength, sizeof(ItemLength) );
uint16_t copy = ItemLength;
SwapperDoOp::SwapArray(©,1);
os.write( (char*)©, sizeof(ItemLength) );
assert( ItemLength > UIDLength );
uint16_t uidlength = UIDLength;
SwapperDoOp::SwapArray(&uidlength,1);
os.write( (char*)&uidlength, sizeof(UIDLength) );
assert( (size_t)UIDLength == Name.size() );
os.write( Name.c_str(), Name.size() );
uint8_t scurole = SCURole;
assert( scurole == 0 || scurole == 1 );
os.write( (char*)&scurole, sizeof(SCURole) );
uint8_t scprole = SCPRole;
assert( scprole == 0 || scprole == 1 );
os.write( (char*)&scprole, sizeof(SCPRole) );
return os;
}
size_t RoleSelectionSub::Size() const
{
size_t ret = 0;
ret += sizeof(ItemType);
ret += sizeof(Reserved2);
ret += sizeof(ItemLength);
ret += sizeof(UIDLength);
assert( Name.size() == UIDLength );
ret += UIDLength;
ret += sizeof(SCURole);
ret += sizeof(SCPRole);
return ret;
}
/*
SCU-role This byte field shall contain the SCU-role as defined for the
Association-requester in Section D.3.3.4. It shall be encoded
as an unsigned binary and shall use one of the following
values:
0 - non support of the SCU role
1 - support of the SCU role
SCP-role This byte field shall contain the SCP-role as defined for the
Association-requester in Section D.3.3.4. It shall be encoded
as an unsigned binary and shall use one of the following
values:
0 - non support of the SCP role
1 - support of the SCP role.
*/
void RoleSelectionSub::SetTuple(const char *uid, uint8_t scurole, uint8_t scprole)
{
if( uid )
{
Name = uid;
UIDLength = (uint16_t)strlen( uid );
assert( (size_t)UIDLength == Name.size() );
SCURole = scurole % 2;
SCPRole = scprole % 2;
ItemLength = (uint16_t)(Size() - 4);
}
// post condition
assert( (size_t)ItemLength + 4 == Size() );
}
void RoleSelectionSub::Print(std::ostream &os) const
{
os << "SOP-class-uid" << Name << std::endl;
os << "SCURole: " << (int)SCURole << std::endl;
os << "SCPRole: " << (int)SCPRole << std::endl;
}
} // end namespace network
} // end namespace gdcm
|