RetroZilla/xpfe/bootstrap/appleevents/nsAEClassIterator.h
2015-10-20 23:03:22 -04:00

208 lines
7.6 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Simon Fraser <sfraser@netscape.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef __AECLASSITERATOR__
#define __AECLASSITERATOR__
#include "nsAETokens.h"
class AEClassIterator
{
protected:
enum
{
eFormAbsolutePositionBit = 0,
eFormRelativePositionBit,
eFormTestBit,
eFormRangeBit,
eFormPropertyIDBit,
eFormNameBit
};
public:
enum
{
eHasFormAbsolutePosition = (1 << eFormAbsolutePositionBit),
eHasFormRelativePosition = (1 << eFormRelativePositionBit),
eHasFormTest = (1 << eFormTestBit),
eHasFormRange = (1 << eFormPropertyIDBit),
eHasFormPropertyID = (1 << eFormRangeBit),
eHasFormName = (1 << eFormNameBit),
eStandardKeyFormSupport = (eHasFormAbsolutePosition | eHasFormRelativePosition | eHasFormRange | eHasFormName)
};
AEClassIterator(DescType classType, UInt16 keyFormSupport = eStandardKeyFormSupport)
: mClass(classType)
, mKeyFormSupport(keyFormSupport)
{}
virtual ~AEClassIterator() {}
virtual void GetItemFromContainer( DescType desiredClass,
const AEDesc* containerToken,
DescType containerClass,
DescType keyForm,
const AEDesc* keyData,
AEDesc* resultToken);
virtual UInt32 GetNumItems(const AEDesc* containerToken) = 0; // get the number of items
typedef UInt32 ItemRef; // runtime, optimized reference to an object
typedef UInt32 ItemID; // persistent reference, used for storage
protected:
static const ItemRef kNoItemRef; // value for a nonexistent item reference (usu. -1)
static const ItemID kNoItemID; // value for a nonexistent item ID (usu -1)
virtual ItemRef GetNamedItemReference(const AEDesc* containerToken, const char *itemName) = 0;
virtual ItemRef GetIndexedItemReference(const AEDesc* containerToken, TAEListIndex itemIndex) = 0;
virtual TAEListIndex GetIndexFromItemID(const AEDesc* containerToken, ItemID itemID) = 0;
virtual ItemID GetNamedItemID(const AEDesc* containerToken, const char *itemName) = 0;
virtual ItemID GetIndexedItemID(const AEDesc* containerToken, TAEListIndex itemIndex) = 0;
// index to name
virtual void GetIndexedItemName(const AEDesc* containerToken, TAEListIndex itemIndex, char *outName, long maxLen) = 0;
// conversion routines.
virtual ItemID GetIDFromReference(const AEDesc* containerToken, ItemRef itemRef) = 0;
virtual ItemRef GetReferenceFromID(const AEDesc* containerToken, ItemID itemID) = 0;
virtual ItemID GetItemIDFromToken(const AEDesc* token) = 0;
virtual void SetItemIDInCoreToken(const AEDesc* containerToken, CoreTokenRecord* tokenRecord, ItemID itemID) = 0;
// Range and index processing routines.
virtual ItemRef ProcessFormRelativePostition(const AEDesc* anchorToken, const AEDesc *keyData);
TAEListIndex NormalizeAbsoluteIndex(const AEDesc *keyData, TAEListIndex maxIndex, Boolean *isAllItems);
void ProcessFormRange(AEDesc *keyData, AEDesc *start, AEDesc *stop);
void CheckKeyFormSupport(DescType keyForm); // throws if unsupported key form
DescType GetClass() { return mClass; }
DescType mClass;
UInt16 mKeyFormSupport;
};
class AENamedClassIterator : public AEClassIterator
{
public:
AENamedClassIterator(DescType classType)
: AEClassIterator(classType, eHasFormName)
{}
~AENamedClassIterator() {}
virtual void GetItemFromContainer( DescType desiredClass,
const AEDesc* containerToken,
DescType containerClass,
DescType keyForm,
const AEDesc* keyData,
AEDesc* resultToken);
protected:
// stubs for those pure virtual functions that we can't use with named items
virtual UInt32 GetNumItems(const AEDesc* containerToken) { return 0; }
virtual ItemRef GetNamedItemReference(const AEDesc* containerToken, const char *itemName) { return kNoItemRef; }
virtual ItemRef GetIndexedItemReference(const AEDesc* containerToken, TAEListIndex itemIndex) { return kNoItemRef; }
virtual TAEListIndex GetIndexFromItemID(const AEDesc* containerToken, ItemID itemID) { return 0; }
virtual Boolean NamedItemExists(const AEDesc* containerToken, const char *itemName) = 0;
virtual ItemID GetNamedItemID(const AEDesc* containerToken, const char *itemName) { return kNoItemID; }
virtual ItemID GetIndexedItemID(const AEDesc* containerToken, TAEListIndex itemIndex) { return kNoItemID; }
// index to name
virtual void GetIndexedItemName(const AEDesc* containerToken, TAEListIndex itemIndex, char *outName, long maxLen) {}
// conversion routines.
virtual ItemID GetIDFromReference(const AEDesc* containerToken, ItemRef itemRef) { return kNoItemID; }
virtual ItemRef GetReferenceFromID(const AEDesc* containerToken, ItemID itemID) { return kNoItemRef; }
virtual ItemID GetItemIDFromToken(const AEDesc* token) { return kNoItemID; }
virtual void SetItemIDInCoreToken(const AEDesc* containerToken, CoreTokenRecord* tokenRecord, ItemID itemID) {}
virtual void SetNamedItemIDInCoreToken(const AEDesc* containerToken, CoreTokenRecord* token, const char *itemName) = 0;
};
// base class for items that cannot be referred to by name
class AEUnnamedClassIterator : public AEClassIterator
{
public:
enum
{
eNoNameKeyFormSupport = (eHasFormAbsolutePosition | eHasFormRelativePosition | eHasFormRange)
};
AEUnnamedClassIterator(DescType classType)
: AEClassIterator(classType, eNoNameKeyFormSupport)
{}
~AEUnnamedClassIterator() {}
protected:
virtual ItemRef GetNamedItemReference(const AEDesc* containerToken, const char *itemName) { ThrowOSErr(errAEEventNotHandled); return 0; }
virtual ItemID GetNamedItemID(const AEDesc* containerToken, const char *itemName) { ThrowOSErr(errAEEventNotHandled); return 0; }
virtual void GetIndexedItemName(const AEDesc* containerToken, TAEListIndex itemIndex, char *outName, long maxLen) { ThrowOSErr(errAEEventNotHandled); }
};
#endif /* __AECLASSITERATOR__ */