version 1.2, 2006/01/30 16:16:48
|
version 1.6, 2008/12/01 17:49:51
|
|
|
//%2006//////////////////////////////////////////////////////////////////////// |
//%LICENSE//////////////////////////////////////////////////////////////// |
// | // |
// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development |
// Licensed to The Open Group (TOG) under one or more contributor license |
// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems. |
// agreements. Refer to the OpenPegasusNOTICE.txt file distributed with |
// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.; |
// this work for additional information regarding copyright ownership. |
// IBM Corp.; EMC Corporation, The Open Group. |
// Each contributor licenses this file to you under the OpenPegasus Open |
// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.; |
// Source License; you may not use this file except in compliance with the |
// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group. |
// License. |
// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.; |
// |
// EMC Corporation; VERITAS Software Corporation; The Open Group. |
// Permission is hereby granted, free of charge, to any person obtaining a |
// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.; |
// copy of this software and associated documentation files (the "Software"), |
// EMC Corporation; Symantec Corporation; The Open Group. |
// to deal in the Software without restriction, including without limitation |
// |
// the rights to use, copy, modify, merge, publish, distribute, sublicense, |
// Permission is hereby granted, free of charge, to any person obtaining a copy |
// and/or sell copies of the Software, and to permit persons to whom the |
// of this software and associated documentation files (the "Software"), to |
// Software is furnished to do so, subject to the following conditions: |
// deal in the Software without restriction, including without limitation the |
// |
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or |
// The above copyright notice and this permission notice shall be included |
// sell copies of the Software, and to permit persons to whom the Software is |
// in all copies or substantial portions of the Software. |
// furnished to do so, subject to the following conditions: |
// |
// |
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN |
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED |
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT |
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR |
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
// | // |
//============================================================================== |
////////////////////////////////////////////////////////////////////////// |
// |
|
// Author: Humberto Rivero (hurivero@us.ibm.com) |
|
// |
|
// Modified By: Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com) |
|
// | // |
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
|
|
| |
PEGASUS_NAMESPACE_BEGIN | PEGASUS_NAMESPACE_BEGIN |
| |
////////////////////////////////////////////////////////////// |
|
// | // |
// ContentLanguageListRep |
// Implementation Notes: |
|
// ===================== |
|
// |
|
// See the implemetnation notes in AcceptLanguageList.cpp for an explanation |
|
// of how we overlay the _rep pointer with the array class. |
// | // |
////////////////////////////////////////////////////////////// |
|
| |
class ContentLanguageListRep |
typedef Array<LanguageTag> LanguageTagArray; |
|
|
|
static inline LanguageTagArray& GetLanguageTagArray( |
|
ContentLanguageList* list) |
{ | { |
public: |
return *reinterpret_cast<LanguageTagArray*>(list); |
Array<LanguageTag> container; |
} |
}; |
|
| |
////////////////////////////////////////////////////////////// |
static inline const LanguageTagArray& GetLanguageTagArray( |
// |
const ContentLanguageList* list) |
// ContentLanguageList |
{ |
// |
return *reinterpret_cast<const LanguageTagArray*>(list); |
////////////////////////////////////////////////////////////// |
} |
| |
ContentLanguageList::ContentLanguageList() | ContentLanguageList::ContentLanguageList() |
{ | { |
_rep = new ContentLanguageListRep(); |
LanguageTagArray& self = GetLanguageTagArray(this); |
|
new (&self) LanguageTagArray(); |
} | } |
| |
ContentLanguageList::ContentLanguageList( | ContentLanguageList::ContentLanguageList( |
const ContentLanguageList& contentLanguages) |
const ContentLanguageList& x) |
{ | { |
_rep = new ContentLanguageListRep(); |
LanguageTagArray& self = GetLanguageTagArray(this); |
AutoPtr<ContentLanguageListRep> rep(_rep); |
const LanguageTagArray& other = GetLanguageTagArray(&x); |
|
new (&self) LanguageTagArray(other); |
_rep->container = contentLanguages._rep->container; |
|
|
|
rep.release(); |
|
} | } |
| |
ContentLanguageList::~ContentLanguageList() | ContentLanguageList::~ContentLanguageList() |
{ | { |
delete _rep; |
LanguageTagArray& self = GetLanguageTagArray(this); |
|
self.~LanguageTagArray(); |
} | } |
| |
ContentLanguageList& ContentLanguageList::operator=( | ContentLanguageList& ContentLanguageList::operator=( |
const ContentLanguageList& contentLanguages) |
const ContentLanguageList& x) |
{ |
|
if (&contentLanguages != this) |
|
{ | { |
_rep->container = contentLanguages._rep->container; |
LanguageTagArray& self = GetLanguageTagArray(this); |
} |
const LanguageTagArray& other = GetLanguageTagArray(&x); |
|
self = other; |
return *this; | return *this; |
} | } |
| |
Uint32 ContentLanguageList::size() const | Uint32 ContentLanguageList::size() const |
{ | { |
return _rep->container.size(); |
const LanguageTagArray& self = GetLanguageTagArray(this); |
|
return self.size(); |
} | } |
| |
LanguageTag ContentLanguageList::getLanguageTag(Uint32 index) const | LanguageTag ContentLanguageList::getLanguageTag(Uint32 index) const |
{ | { |
return LanguageTag(_rep->container[index]); |
const LanguageTagArray& self = GetLanguageTagArray(this); |
|
return self[index]; |
} | } |
| |
void ContentLanguageList::append(const LanguageTag& languageTag) | void ContentLanguageList::append(const LanguageTag& languageTag) |
{ | { |
|
LanguageTagArray& self = GetLanguageTagArray(this); |
|
|
// Disallow "*" language tag | // Disallow "*" language tag |
if (languageTag.toString() == "*") | if (languageTag.toString() == "*") |
{ | { |
|
|
throw InvalidContentLanguageHeader(MessageLoader::getMessage(parms)); | throw InvalidContentLanguageHeader(MessageLoader::getMessage(parms)); |
} | } |
| |
_rep->container.append(languageTag); |
self.append(languageTag); |
} | } |
| |
void ContentLanguageList::remove(Uint32 index) | void ContentLanguageList::remove(Uint32 index) |
{ | { |
_rep->container.remove(index); |
LanguageTagArray& self = GetLanguageTagArray(this); |
|
self.remove(index); |
} | } |
| |
Uint32 ContentLanguageList::find(const LanguageTag& languageTag) const | Uint32 ContentLanguageList::find(const LanguageTag& languageTag) const |
{ | { |
for (Uint32 i = 0; i < _rep->container.size(); i++) |
const LanguageTagArray& self = GetLanguageTagArray(this); |
{ |
|
if (languageTag == _rep->container[i]) |
for (Uint32 i = 0; i < self.size(); i++) |
{ | { |
|
if (languageTag == self[i]) |
return i; | return i; |
} | } |
} |
|
return PEG_NOT_FOUND; | return PEG_NOT_FOUND; |
} | } |
| |
void ContentLanguageList::clear() | void ContentLanguageList::clear() |
{ | { |
_rep->container.clear(); |
LanguageTagArray& self = GetLanguageTagArray(this); |
|
self.clear(); |
} | } |
| |
Boolean ContentLanguageList::operator==( |
Boolean ContentLanguageList::operator==(const ContentLanguageList& x) const |
const ContentLanguageList& contentLanguages) const |
|
{ |
|
if (_rep->container.size() != contentLanguages._rep->container.size()) |
|
{ | { |
|
const LanguageTagArray& self = GetLanguageTagArray(this); |
|
const LanguageTagArray& other = GetLanguageTagArray(&x); |
|
|
|
if (self.size() != other.size()) |
return false; | return false; |
} |
|
| |
for (Uint32 i = 0; i < _rep->container.size(); i++) |
for (Uint32 i = 0; i < self.size(); i++) |
{ |
|
if (_rep->container[i] != contentLanguages._rep->container[i]) |
|
{ | { |
|
if (self[i] != other[i]) |
return false; | return false; |
} | } |
} |
|
return true; | return true; |
} | } |
| |
Boolean ContentLanguageList::operator!=( |
Boolean ContentLanguageList::operator!=( const ContentLanguageList& x) const |
const ContentLanguageList& contentLanguages) const |
|
{ | { |
return !(*this == contentLanguages); |
return !operator==(x); |
} | } |
| |
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |