// SMsgDirG2ModifyService::Unpack
// Virtual method from SmallMessage.  Extracts data from message buffer.
void
SMsgDirG2ModifyService::Unpack(void)
{
	WTRACE("SMsgDirG2ModifyService::Unpack");
	SetKeyType(KT_SERVICE);
	SetExtended((GetMessageType() != WONMsg::DirG2ModifyService), (GetMessageType() == WONMsg::DirG2ModifyServiceEx));
	SMsgDirG2UpdateExtendBase::Unpack();

	if ((GetServiceType() != WONMsg::SmallDirServerG2) ||
	    ((GetMessageType() != WONMsg::DirG2ModifyService) &&
	     (GetMessageType() != WONMsg::DirG2ModifyServiceEx) &&
		 (GetMessageType() != WONMsg::DirG2ModifyServiceExObsolete)))
	{
		WDBG_AH("SMsgDirG2ModifyService::Unpack Not a DirG2ModifyService(Ex) message!");
		throw WONMsg::BadMsgException(*this, __LINE__, __FILE__,
		                              "Not a DirG2ModifyService(Ex) message.");
	}

	mEntityFlags = ReadByte();
	UnpackKey(*this);
	ReadWString(mNewName);

	unsigned char aLen = ReadByte();
	WDBG_LL("SMsgDirG2ModifyService::Unpack Read New Addr len=" << aLen);
	if (aLen > 0)
		mNewNetAddress.assign(reinterpret_cast<const unsigned char*>(ReadBytes(aLen)), aLen);

	ReadWString(mNewDisplayName);
	mNewLifespan = ReadLong();
	UnpackExtended();
	UnpackPeerData();
}
// SMsgDirG2ClearDataObjects::Unpack
// Virtual method from SmallMessage.  Extracts data from message buffer.
void
SMsgDirG2ClearDataObjects::Unpack(void)
{
	WTRACE("SMsgDirG2ClearDataObjects::Unpack");
	mClearTypes.clear();
	mKeyType = (GetMessageType() == WONMsg::DirG2ServiceClearDataObjects ? KT_SERVICE : KT_DIRECTORY);
	SMsgDirG2UpdateBase::Unpack();

	if ((GetServiceType() != WONMsg::SmallDirServerG2) ||
	    ((GetMessageType() != WONMsg::DirG2DirectoryClearDataObjects) &&
	     (GetMessageType() != WONMsg::DirG2ServiceClearDataObjects)))
	{
		WDBG_AH("SMsgDirG2ClearDataObjects::Unpack Not a DirG2ClearDataObjects message!");
		throw WONMsg::BadMsgException(*this, __LINE__, __FILE__,
		                              "Not a DirG2ClearDataObjects message.");
	}

	UnpackKey(*this);
	unsigned short aCt = ReadShort();
	WDBG_LL("SMsgDirG2ClearDataObjects::Unpack Reading " << aCt << " entries.");

	for (int i=0; i < aCt; i++)
	{
		DataObject anObj;
		unsigned char aLen = ReadByte();
		if (aLen > 0)
			anObj.GetDataType().assign(reinterpret_cast<const unsigned char*>(ReadBytes(aLen)), aLen);
		mClearTypes.insert(anObj);
	}

	UnpackPeerData();
}
// TMsgDirRenewDirectory::Unpack
// Virtual method from TMessage.  Extracts data from message buffer.
void
TMsgDirRenewDirectory::Unpack(void)
{
	WTRACE("TMsgDirRenewDirectory::Unpack");
	TMsgDirDirectoryBase::Unpack();

	if ((GetServiceType() != WONMsg::DirServer) ||
	    (GetMessageType() != WONMsg::DirRenewDirectory))
	{
		WDBG_AH("TMsgDirRenewDirectory::Unpack Not a DirRenewDirectory message!");
		throw WONMsg::BadMsgException(*this, __LINE__, __FILE__,
		                              "Not a DirRenewDirectory message.");
	}

	WDBG_LL("TMsgDirRenewDirectory::Unpack Reading message data");
	mLifespan = ReadLong();

	// Unpack peer data if needed
	UnpackPeerData();
}
// SMsgDirG2SetDataObjects::Unpack
// Virtual method from SmallMessage.  Extracts data from message buffer.
void
SMsgDirG2SetDataObjects::Unpack(void)
{
	WTRACE("SMsgDirG2SetDataObjects::Unpack");
	mKeyType  = (GetMessageType() == WONMsg::DirG2ServiceSetDataObjects ? KT_SERVICE : KT_DIRECTORY);
	SetExtended(true, false);
	SMsgDirG2UpdateExtendBase::Unpack();

	if ((GetServiceType() != WONMsg::SmallDirServerG2) ||
	    ((GetMessageType() != WONMsg::DirG2DirectorySetDataObjects) &&
	     (GetMessageType() != WONMsg::DirG2ServiceSetDataObjects)))
	{
		WDBG_AH("SMsgDirG2SetDataObjects::Unpack Not a DirG2SetDataObjects message!");
		throw WONMsg::BadMsgException(*this, __LINE__, __FILE__,
		                              "Not a DirG2SetDataObjects message.");
	}

	mSetMode = static_cast<WONMsg::DirG2DataObjectSetMode>(ReadByte());
	UnpackKey(*this);
	UnpackExtended();
	UnpackPeerData();
}
// SMsgDirG2ExplicitSetDataObjects::Unpack
// Virtual method from SmallMessage.  Extracts data from message buffer.
void
SMsgDirG2ExplicitSetDataObjects::Unpack(void)
{
	WTRACE("SMsgDirG2ExplicitSetDataObjects::Unpack");
	mObjects.clear();
	mKeyType = (GetMessageType() == WONMsg::DirG2ServiceExplicitSetDataObjects ? KT_SERVICE : KT_DIRECTORY);
	SMsgDirG2UpdateBase::Unpack();

	if ((GetServiceType() != WONMsg::SmallDirServerG2) ||
	    ((GetMessageType() != WONMsg::DirG2DirectoryExplicitSetDataObjects) &&
	     (GetMessageType() != WONMsg::DirG2ServiceExplicitSetDataObjects)))
	{
		WDBG_AH("SMsgDirG2ExplicitSetDataObjects::Unpack Not a DirG2ExplicitSetDataObjects message!");
		throw WONMsg::BadMsgException(*this, __LINE__, __FILE__,
		                              "Not a DirG2ExplicitSetDataObjects message.");
	}

	UnpackKey(*this);
	unsigned short aCt = ReadShort();
	WDBG_LL("SMsgDirG2ExplicitSetDataObjects::Unpack Reading " << aCt << " objects.");

	for (int i=0; i < aCt; i++)
	{
		ExplicitDOInfo anObj;
		anObj.mSetMode = static_cast<WONMsg::DirG2DataObjectSetMode>(ReadByte());

		unsigned char aTypeLen = ReadByte();
		if (aTypeLen > 0)
			anObj.mData.GetDataType().assign(reinterpret_cast<const unsigned char*>(ReadBytes(aTypeLen)), aTypeLen);

		unsigned short aDataLen = ReadShort();
		if (aDataLen > 0)
			anObj.mData.GetData().assign(reinterpret_cast<const unsigned char*>(ReadBytes(aDataLen)), aDataLen);

		mObjects.push_back(anObj);
	}

	UnpackPeerData();
}