VirtualBox

Changeset 8093 in vbox for trunk/src/VBox/Frontends


Ignore:
Timestamp:
Apr 17, 2008 12:34:17 PM (17 years ago)
Author:
vboxsync
Message:

FE/Qt: Be consistent (use the same spelling in the Details box as in the Hard Disk UI; method order).

Location:
trunk/src/VBox/Frontends/VirtualBox
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/include/VBoxGlobal.h

    r8071 r8093  
    215215    }
    216216
    217     KStorageBus toStorageBusType (const QString &s) const
    218     {
    219         QStringVector::const_iterator it =
    220             qFind (storageBuses.begin(), storageBuses.end(), s);
    221         AssertMsg (it != storageBuses.end(), ("No value for {%s}", s.latin1()));
     217    /**
     218     * Returns a string representation of the given KStorageBus enum value.
     219     * Complementary to #toStorageBusType (const QString &) const.
     220     */
     221    QString toString (KStorageBus aBus) const
     222    {
     223        AssertMsg (!storageBuses [aBus].isNull(), ("No text for %d", aBus));
     224        return storageBuses [aBus];
     225    }
     226
     227    /**
     228     * Returns a KStorageBus enum value corresponding to the given string
     229     * representation. Complementary to #toString (KStorageBus) const.
     230     */
     231    KStorageBus toStorageBusType (const QString &aBus) const
     232    {
     233        QStringVector::const_iterator it =
     234            qFind (storageBuses.begin(), storageBuses.end(), aBus);
     235        AssertMsg (it != storageBuses.end(), ("No value for {%s}", aBus.latin1()));
    222236        return KStorageBus (it - storageBuses.begin());
    223237    }
    224238
    225     QString toString (KStorageBus t) const
    226     {
    227         AssertMsg (!storageBuses [t].isNull(), ("No text for %d", t));
    228         return storageBuses [t];
    229     }
    230 
    231     LONG toStorageChannelType (KStorageBus t, const QString &c) const;
    232     QString toString (KStorageBus t, LONG c) const;
    233 
    234     LONG toStorageDeviceType (KStorageBus t, const QString &c) const;
    235     QString toString (KStorageBus t, LONG c, LONG d) const;
     239    QString toString (KStorageBus aBus, LONG aChannel) const;
     240    LONG toStorageChannel (KStorageBus aBus, const QString &aChannel) const;
     241
     242    QString toString (KStorageBus aBus, LONG aChannel, LONG aDevice) const;
     243    LONG toStorageDevice (KStorageBus aBus, LONG aChannel, const QString &aDevice) const;
     244
     245    QString toFullString (KStorageBus aBus, LONG aChannel, LONG aDevice) const;
    236246
    237247    QString toString (KHardDiskType t) const
  • trunk/src/VBox/Frontends/VirtualBox/src/VBoxGlobal.cpp

    r8071 r8093  
    738738    , deviceTypes (KDeviceType_COUNT)
    739739    , storageBuses (KStorageBus_COUNT)
    740     , storageBusDevices (4)
    741     , storageBusChannels (3)
     740    , storageBusDevices (3)
     741    , storageBusChannels (2)
    742742    , diskTypes (KHardDiskType_COUNT)
    743743    , diskStorageTypes (KHardDiskStorageType_COUNT)
     
    960960}
    961961
    962 LONG VBoxGlobal::toStorageDeviceType (KStorageBus t, const QString &c) const
    963 {
    964     LONG device;
    965     switch (t)
     962/**
     963 * Returns a string representation of the given channel number on the given
     964 * storage bus. Complementary to #toStorageChannel (KStorageBus, const
     965 * QString &) const.
     966 */
     967QString VBoxGlobal::toString (KStorageBus aBus, LONG aChannel) const
     968{
     969    Assert (storageBusChannels.count() == 2);
     970    QString channel;
     971
     972    switch (aBus)
    966973    {
    967974        case KStorageBus_IDE:
    968975        {
     976            if (aChannel == 0 || aChannel == 1)
     977            {
     978                channel = storageBusChannels [aChannel];
     979                break;
     980            }
     981
     982            AssertMsgFailedBreakVoid (("Invalid channel %d\n", aChannel));
     983        }
     984        case KStorageBus_SATA:
     985        {
     986            AssertMsgBreakVoid (aChannel == 0, ("Invalid channel %d\n", aChannel));
     987
     988            /* null string since the SATA channel is alwayz zero so far */
     989            break;
     990        }
     991        default:
     992            AssertFailedBreakVoid();
     993    }
     994
     995    return channel;
     996}
     997
     998/**
     999 * Returns a channel number on the given storage bus corresponding to the given
     1000 * string representation. Complementary to #toString (KStorageBus, LONG) const.
     1001 */
     1002LONG VBoxGlobal::toStorageChannel (KStorageBus aBus, const QString &aChannel) const
     1003{
     1004    LONG channel = 0;
     1005
     1006    switch (aBus)
     1007    {
     1008        case KStorageBus_IDE:
     1009        {
    9691010            QStringVector::const_iterator it =
    970                 qFind (storageBusDevices.begin(), storageBusDevices.end(), c);
    971             AssertMsg (it != storageBusDevices.end(), ("No value for {%s}", c.latin1()));
     1011                qFind (storageBusChannels.begin(), storageBusChannels.end(),
     1012                       aChannel);
     1013            AssertMsgBreakVoid (it != storageBusChannels.end(),
     1014                                ("No value for {%s}\n", aChannel.latin1()));
     1015            channel = (LONG) (it - storageBusChannels.begin());
     1016            break;
     1017        }
     1018        case KStorageBus_SATA:
     1019        {
     1020            AssertMsgBreakVoid (aChannel.isEmpty(),
     1021                                ("Invalid channel {%s}\n", aChannel.latin1()));
     1022            /* always zero so far for SATA */
     1023            break;
     1024        }
     1025        default:
     1026            AssertFailedBreakVoid();
     1027    }
     1028
     1029    return channel;
     1030}
     1031
     1032/**
     1033 * Returns a string representation of the given device number of the given
     1034 * channel on the given storage bus. Complementary to #toStorageDevice
     1035 * (KStorageBus, LONG, const QString &) const.
     1036 */
     1037QString VBoxGlobal::toString (KStorageBus aBus, LONG aChannel, LONG aDevice) const
     1038{
     1039    NOREF (aChannel);
     1040
     1041    Assert (storageBusDevices.count() == 3);
     1042    QString device;
     1043
     1044    switch (aBus)
     1045    {
     1046        case KStorageBus_IDE:
     1047        {
     1048            if (aDevice == 0 || aDevice == 1)
     1049            {
     1050                device = storageBusDevices [aDevice];
     1051                break;
     1052            }
     1053
     1054            AssertMsgFailedBreakVoid (("Invalid device %d\n", aDevice));
     1055        }
     1056        case KStorageBus_SATA:
     1057        {
     1058            device = storageBusDevices [2].arg (aDevice);
     1059            break;
     1060        }
     1061        default:
     1062            AssertFailedBreakVoid();
     1063    }
     1064
     1065    return device;
     1066}
     1067
     1068/**
     1069 * Returns a device number of the given channel on the given storage bus
     1070 * corresponding to the given string representation. Complementary to #toString
     1071 * (KStorageBus, LONG, LONG) const.
     1072 */
     1073LONG VBoxGlobal::toStorageDevice (KStorageBus aBus, LONG aChannel,
     1074                                  const QString &aDevice) const
     1075{
     1076    NOREF (aChannel);
     1077
     1078    LONG device = 0;
     1079
     1080    switch (aBus)
     1081    {
     1082        case KStorageBus_IDE:
     1083        {
     1084            QStringVector::const_iterator it =
     1085                qFind (storageBusDevices.begin(), storageBusDevices.end(),
     1086                       aDevice);
     1087            AssertMsg (it != storageBusDevices.end(),
     1088                       ("No value for {%s}", aDevice.latin1()));
    9721089            device = (LONG) (it - storageBusDevices.begin());
    9731090            break;
    9741091        }
    975         default:
    976         {
    977             device = 0;
    978             break;
    979         }
    980     }
    981     return device;
    982 }
    983 
    984 QString VBoxGlobal::toString (KStorageBus t, LONG c, LONG d) const
    985 {
    986     Assert (storageBusDevices.count() == 4);
    987     QString dev;
    988 
    989     NOREF(c);
    990     switch (t)
    991     {
    992         case KStorageBus_IDE:
    993         {
    994             if (d == 0 || d == 1)
     1092        case KStorageBus_SATA:
     1093        {
     1094            /// @todo use regexp to properly extract the %1 text
     1095            QString tpl = storageBusDevices [2].arg ("");
     1096            if (aDevice.startsWith (tpl))
    9951097            {
    996                 dev = storageBusDevices [d];
     1098                device = aDevice.right (aDevice.length() - tpl.length()).toLong();
    9971099                break;
    9981100            }
     1101
     1102            AssertMsgFailedBreakVoid (("Invalid device {%s}\n", aDevice.latin1()));
     1103        }
     1104        default:
     1105            AssertFailedBreakVoid();
     1106    }
     1107
     1108    return device;
     1109}
     1110
     1111/**
     1112 * Returns a full string representation of the given device of the given channel
     1113 * on the given storage bus. Complementary to #toStorageParams (KStorageBus,
     1114 * LONG, LONG) const.
     1115 */
     1116QString VBoxGlobal::toFullString (KStorageBus aBus, LONG aChannel,
     1117                                  LONG aDevice) const
     1118{
     1119    QString device;
     1120
     1121    switch (aBus)
     1122    {
     1123        case KStorageBus_IDE:
     1124        {
     1125            device = QString ("%1 %2 %3")
     1126                .arg (vboxGlobal().toString (aBus))
     1127                .arg (vboxGlobal().toString (aBus, aChannel))
     1128                .arg (vboxGlobal().toString (aBus, aChannel, aDevice));
     1129            break;
    9991130        }
    10001131        case KStorageBus_SATA:
    10011132        {
    1002             dev = storageBusDevices [3].arg (d);
     1133            /* we only have one SATA channel so far which is always zero */
     1134            device = QString ("%1 %2")
     1135                .arg (vboxGlobal().toString (aBus))
     1136                .arg (vboxGlobal().toString (aBus, aChannel, aDevice));
    10031137            break;
    10041138        }
    10051139        default:
    1006             dev = storageBusDevices [2].arg (d);
    1007     }
    1008     return dev;
    1009 }
    1010 
    1011 LONG VBoxGlobal::toStorageChannelType (KStorageBus t, const QString &c) const
    1012 {
    1013     LONG channel;
    1014     switch (t)
    1015     {
    1016         case KStorageBus_IDE:
    1017         {
    1018             QStringVector::const_iterator it =
    1019                 qFind (storageBusChannels.begin(), storageBusChannels.end(), c);
    1020             AssertMsg (it != storageBusChannels.end(), ("No value for {%s}", c.latin1()));
    1021             channel = (LONG) (it - storageBusChannels.begin());
    1022             break;
    1023         }
    1024         default:
    1025         {
    1026             channel = 0;
    1027             break;
    1028         }
    1029     }
    1030     return channel;
    1031 }
    1032 
    1033 QString VBoxGlobal::toString (KStorageBus t, LONG c) const
    1034 {
    1035     Assert (storageBusChannels.count() == 3);
    1036     QString dev;
    1037     switch (t)
    1038     {
    1039         case KStorageBus_IDE:
    1040         {
    1041             if (c == 0 || c == 1)
    1042             {
    1043                 dev = storageBusChannels [c];
    1044                 break;
    1045             }
    1046         }
    1047         default:
    1048             dev = storageBusChannels [2].arg (c);
    1049     }
    1050     return dev;
     1140            AssertFailedBreakVoid();
     1141    }
     1142
     1143    return device;
    10511144}
    10521145
     
    14391532                {
    14401533                    QString src = root.GetLocation();
     1534                    KStorageBus bus = hda.GetBus();
     1535                    LONG channel = hda.GetChannel();
     1536                    LONG device = hda.GetDevice();
    14411537                    hardDisks += QString (sSectionItemTpl)
    1442                         .arg (QString ("%1 %2")
    1443                               .arg (toString (hda.GetBus(), hda.GetChannel()))
    1444                               .arg (toString (hda.GetBus(), hda.GetChannel(),
    1445                                               hda.GetDevice())))
     1538                        .arg (toFullString (bus, channel, device))
    14461539                        .arg (QString ("%1 [<nobr>%2</nobr>]")
    14471540                              .arg (prepareFileNameForHTML (src))
     
    23442437        tr ("SATA", "StorageBus");
    23452438
    2346     Assert (storageBusChannels.count() == 3);
     2439    Assert (storageBusChannels.count() == 2);
    23472440    storageBusChannels [0] =
    23482441        tr ("Primary", "StorageBusChannel");
    23492442    storageBusChannels [1] =
    23502443        tr ("Secondary", "StorageBusChannel");
    2351     storageBusChannels [2] =
    2352         tr ("Channel&nbsp;%1", "StorageBusChannel");
    2353 
    2354     Assert (storageBusDevices.count() == 4);
     2444
     2445    Assert (storageBusDevices.count() == 3);
    23552446    storageBusDevices [0] = tr ("Master", "StorageBusDevice");
    23562447    storageBusDevices [1] = tr ("Slave", "StorageBusDevice");
    2357     storageBusDevices [2] = tr ("Device&nbsp;%1", "StorageBusDevice");
    2358     storageBusDevices [3] = tr ("Port %1", "StorageBusDevice");
     2448    storageBusDevices [2] = tr ("Port %1", "StorageBusDevice");
    23592449
    23602450    diskTypes [KHardDiskType_Normal] =
  • trunk/src/VBox/Frontends/VirtualBox/ui/VBoxHardDiskSettings.ui

    r8075 r8093  
    11<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
    22<class>VBoxHardDiskSettings</class>
     3<comment>
     4:mode=html:tabSize=4:indentSize=4:noTabs=true:
     5:folding=explicit:collapseFolds=1:
     6
     7VBox GUI: Hard Disk Settings UI (Qt Designer).
     8
     9     Copyright (C) 2008 innotek GmbH
     10
     11     This file is part of VirtualBox Open Source Edition (OSE), as
     12     available from http://www.virtualbox.org. This file is free software;
     13     you can redistribute it and/or modify it under the terms of the GNU
     14     General Public License (GPL) as published by the Free Software
     15     Foundation, in version 2 as it comes in the "COPYING" file of the
     16     VirtualBox OSE distribution. VirtualBox OSE is distributed in the
     17     hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
     18</comment>
    319<widget class="QWidget">
    420    <property name="name">
  • trunk/src/VBox/Frontends/VirtualBox/ui/VBoxHardDiskSettings.ui.h

    r8075 r8093  
    66
    77/*
    8  * Copyright (C) 2006-2007 innotek GmbH
     8 * Copyright (C) 2008 innotek GmbH
    99 *
    1010 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    2828class HDSlotItem;
    2929
     30/** Combines the string and the numeric representation of the hard disk slot. */
     31struct HDSlot
     32{
     33    HDSlot() : bus (KStorageBus_Null), channel (0), device (0) {}
     34    HDSlot (const QString &aStr, KStorageBus aBus, LONG aChannel, LONG aDevice)
     35        : str (aStr), bus (aBus), channel (aChannel), device (aDevice) {}
     36
     37    QString str;
     38    KStorageBus bus;
     39    LONG channel;
     40    LONG device;
     41};
     42
    3043/**
    3144 *  QObject class reimplementation to use for making selected IDE & SATA
     
    4760    }
    4861
    49     QStringList list (HDSlotItem *aForSubscriber);
     62    QValueList <HDSlot> list (HDSlotItem *aForSubscriber);
    5063
    5164    int totalCount() { return mIDEList.size() + mSATAList.size(); }
     
    95108    void makeIDEList()
    96109    {
    97         QString device ("%1 %2 %3");
    98 
    99110        mIDEList.clear();
    100111
    101112        /* IDE Primary Master */
    102         mIDEList << device.arg (vboxGlobal().toString (KStorageBus_IDE))
    103                           .arg (vboxGlobal().toString (KStorageBus_IDE, 0))
    104                           .arg (vboxGlobal().toString (KStorageBus_IDE, 0, 0));
    105 
     113        mIDEList << HDSlot (vboxGlobal().toFullString (KStorageBus_IDE, 0, 0),
     114                            KStorageBus_IDE, 0, 0);
    106115        /* IDE Primary Slave */
    107         mIDEList << device.arg (vboxGlobal().toString (KStorageBus_IDE))
    108                           .arg (vboxGlobal().toString (KStorageBus_IDE, 0))
    109                           .arg (vboxGlobal().toString (KStorageBus_IDE, 0, 1));
    110 
     116        mIDEList << HDSlot (vboxGlobal().toFullString (KStorageBus_IDE, 0, 1),
     117                            KStorageBus_IDE, 0, 1);
    111118        /* IDE Secondary Slave */
    112         mIDEList << device.arg (vboxGlobal().toString (KStorageBus_IDE))
    113                           .arg (vboxGlobal().toString (KStorageBus_IDE, 1))
    114                           .arg (vboxGlobal().toString (KStorageBus_IDE, 1, 1));
     119        mIDEList << HDSlot (vboxGlobal().toFullString (KStorageBus_IDE, 1, 1),
     120                            KStorageBus_IDE, 1, 1);
    115121
    116122        emit listChanged();
     
    119125    void makeSATAList()
    120126    {
    121         QString device ("%1 %2");
    122 
    123127        mSATAList.clear();
    124128
    125129        for (int i = 0; i < mSataPortsCount; ++ i)
    126             mSATAList << device.arg (vboxGlobal().toString (KStorageBus_SATA))
    127                                .arg (vboxGlobal().toString (KStorageBus_SATA, 0, i));
     130            mSATAList << HDSlot (vboxGlobal().toFullString (KStorageBus_SATA, 0, i),
     131                                 KStorageBus_SATA, 0, i);
    128132
    129133        emit listChanged();
     
    131135
    132136    int mSataPortsCount;
    133     QStringList mIDEList;
    134     QStringList mSATAList;
     137    QValueList <HDSlot> mIDEList;
     138    QValueList <HDSlot> mSATAList;
    135139    QPtrVector<HDSlotItem> mSubscribersList;
    136140};
     
    166170    }
    167171
     172    KStorageBus currentBus() const
     173    {
     174        AssertReturn (currentItem() >= 0 && (size_t) currentItem() < mHDSlots.size(),
     175                      KStorageBus_Null);
     176        return mHDSlots [currentItem()].bus;
     177    }
     178
     179    LONG currentChannel() const
     180    {
     181        AssertReturn (currentItem() >= 0 && (size_t) currentItem() < mHDSlots.size(),
     182                      0);
     183        return mHDSlots [currentItem()].channel;
     184    }
     185
     186    LONG currentDevice() const
     187    {
     188        AssertReturn (currentItem() >= 0 && (size_t) currentItem() < mHDSlots.size(),
     189                      0);
     190        return mHDSlots [currentItem()].device;
     191    }
     192
    168193private slots:
    169194
    170195    void refresh()
    171196    {
    172         QString currentItem = currentText();
    173         QStringList newList (mUniq->list (this));
     197        QString current = currentText();
     198        mHDSlots = mUniq->list (this);
    174199        clear();
    175         insertStringList (newList);
    176         if (newList.contains (currentItem))
    177             setCurrentText (currentItem);
     200
     201        bool setCurrent = false;
     202
     203        for (QValueList <HDSlot>::const_iterator it = mHDSlots.begin();
     204             it != mHDSlots.end(); ++ it)
     205        {
     206            insertItem ((*it).str);
     207            if (!setCurrent)
     208                setCurrent = (*it).str == current;
     209        }
     210
     211        if (setCurrent)
     212            setCurrentText (current);
    178213    }
    179214
     
    192227
    193228    HDSlotUniquizer *mUniq;
     229
     230    QValueList <HDSlot> mHDSlots;
    194231};
    195232
     
    222259};
    223260
    224 QStringList HDSlotUniquizer::list (HDSlotItem *aSubscriber)
    225 {
    226     QStringList list = mIDEList + mSATAList;
     261QValueList <HDSlot> HDSlotUniquizer::list (HDSlotItem *aSubscriber)
     262{
     263    QValueList <HDSlot> list = mIDEList + mSATAList;
    227264
    228265    /* Compose exclude list */
     
    233270
    234271    /* Filter the list */
    235     QStringList::Iterator it = list.begin();
     272    QValueList <HDSlot>::Iterator it = list.begin();
    236273    while (it != list.end())
    237274    {
    238         if (excludeList.contains (*it))
     275        if (excludeList.contains ((*it).str))
    239276            it = list.remove (it);
    240277        else
     
    293330    }
    294331
    295     KStorageBus getBus() const
    296     {
    297         QStringList list = QStringList::split (' ', text (0));
    298         return vboxGlobal().toStorageBusType (list [0]);
    299     }
    300 
    301     LONG getChannel() const
    302     {
    303         QStringList list = QStringList::split (' ', text (0));
    304         return vboxGlobal().toStorageChannelType (getBus(), list [1]);
    305     }
    306 
    307     LONG getDevice() const
    308     {
    309         QStringList list = QStringList::split (' ', text (0));
    310         switch (getBus())
    311         {
    312             case KStorageBus_IDE:
    313             {
    314                 return vboxGlobal()
    315                     .toStorageDeviceType (KStorageBus_IDE, list [2]);
    316             }
    317             default:
    318             {
    319                 return list [2].toLong();
    320             }
    321         }
     332    KStorageBus bus() const
     333    {
     334        return static_cast <HDSlotItem *> (mVector [0])->currentBus();
     335    }
     336
     337    LONG channel() const
     338    {
     339        return static_cast <HDSlotItem *> (mVector [0])->currentChannel();
     340    }
     341
     342    LONG device() const
     343    {
     344        return static_cast <HDSlotItem *> (mVector [0])->currentDevice();
    322345    }
    323346
     
    349372    void setAttachment (const CHardDiskAttachment &aHda)
    350373    {
    351         QString device;
    352         switch (aHda.GetBus())
    353         {
    354             case KStorageBus_IDE:
    355             {
    356                 device = QString ("%1 %2 %3")
    357                     .arg (vboxGlobal().toString (KStorageBus_IDE))
    358                     .arg (vboxGlobal().toString (KStorageBus_IDE,
    359                                                  aHda.GetChannel()))
    360                     .arg (vboxGlobal().toString (KStorageBus_IDE,
    361                                                  aHda.GetChannel(),
    362                                                  aHda.GetDevice()));
    363                 break;
    364             }
    365             case KStorageBus_SATA:
    366             {
    367                 device = QString ("%1 %2")
    368                     .arg (vboxGlobal().toString (KStorageBus_SATA))
    369                     .arg (vboxGlobal().toString (KStorageBus_SATA,
    370                                                  0, aHda.GetDevice()));
    371                 break;
    372             }
    373             default:
    374                 break;
    375         }
     374        QString device = vboxGlobal()
     375            .toFullString (aHda.GetBus(), aHda.GetChannel(), aHda.GetDevice());
    376376
    377377        if (mVector [0]->listBox()->findItem (device, Qt::ExactMatch))
    378378            mVector [0]->setCurrentText (device);
     379
    379380        static_cast<VBoxMediaComboBox*> (mVector [1])->
    380381            setCurrentItem (aHda.GetHardDisk().GetId());
     382
    381383        mVector [0]->setHidden (true);
    382384        mVector [1]->setHidden (true);
     
    547549    {
    548550        mMachine.AttachHardDisk (item->getId(),
    549             item->getBus(), item->getChannel(), item->getDevice());
     551            item->bus(), item->channel(), item->device());
    550552        if (!mMachine.isOk())
    551553            vboxProblem().cannotAttachHardDisk (this, mMachine, item->getId(),
    552                 item->getBus(), item->getChannel(), item->getDevice());
     554                item->bus(), item->channel(), item->device());
    553555        item = item->nextSibling();
    554556    }
     
    658660        while (sataItem)
    659661        {
    660             if (sataItem->getBus() == KStorageBus_SATA)
     662            if (sataItem->bus() == KStorageBus_SATA)
    661663                break;
    662664            sataItem = sataItem->nextSibling();
     
    684686                    HDListItem *curIt = it;
    685687                    it = it->nextSibling();
    686                     if (curIt->getBus() == KStorageBus_SATA)
     688                    if (curIt->bus() == KStorageBus_SATA)
    687689                    {
    688690                        if (curIt == mLvHD->currentItem())
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette