cellular/sssettings/src/csssettingsrefreshhandler.cpp
author hgs
Tue, 10 Aug 2010 13:19:41 +0300
changeset 38 bc103bfb69cf
parent 33 8d5d7fcf9b59
permissions -rw-r--r--
201031_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2004-2008 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  The Refresh handler to inform SAT refresses.
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
// INCLUDE FILES
hgs
parents:
diff changeset
    21
#include    <centralrepository.h>
hgs
parents:
diff changeset
    22
#include    <rsatrefresh.h> 
hgs
parents:
diff changeset
    23
#include    <BTSapDomainPSKeys.h> // bt sap central repository key. 
hgs
parents:
diff changeset
    24
#include    <featmgr.h>
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
#include    "csssettingsrefreshhandler.h" 
hgs
parents:
diff changeset
    27
#include    "sssettingslogger.h" 
hgs
parents:
diff changeset
    28
#include    "csssettingsactiveobject.h" 
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
// ============================= LOCAL FUNCTIONS ===============================
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
// CLASS DECLARATION
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
/**
hgs
parents:
diff changeset
    36
*  The Refresh notify observer info container.
hgs
parents:
diff changeset
    37
*
hgs
parents:
diff changeset
    38
*  @lib SsSettings.lib
hgs
parents:
diff changeset
    39
*  @since 2.6
hgs
parents:
diff changeset
    40
*/
hgs
parents:
diff changeset
    41
class CSSSettingsNotifyInfo
hgs
parents:
diff changeset
    42
:public CBase
hgs
parents:
diff changeset
    43
    {
hgs
parents:
diff changeset
    44
    public: // Data
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
        // Refresh observer.
hgs
parents:
diff changeset
    47
        MSSSettingsRefreshObserver* iObserver;
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
        // Observed file.
hgs
parents:
diff changeset
    50
        TSatElementaryFiles    iObservedFile;
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
        // Observed refresh type.
hgs
parents:
diff changeset
    53
        TSatRefreshType      iObservedRefreshType;
hgs
parents:
diff changeset
    54
    };
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
// ============================ MEMBER FUNCTIONS ===============================
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    61
// CSSSettingsRefreshHandler::CSSSettingsRefreshHandler
hgs
parents:
diff changeset
    62
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    63
//
hgs
parents:
diff changeset
    64
CSSSettingsRefreshHandler::CSSSettingsRefreshHandler()
hgs
parents:
diff changeset
    65
    {
hgs
parents:
diff changeset
    66
    }
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    69
// CSSSettingsRefreshHandler::ConstructL
hgs
parents:
diff changeset
    70
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    71
//
hgs
parents:
diff changeset
    72
void CSSSettingsRefreshHandler::ConstructL()
hgs
parents:
diff changeset
    73
    {
hgs
parents:
diff changeset
    74
    __SSSLOGSTRING("[SSS]--> CSSSettingsRefreshHandler::ConstructL");
hgs
parents:
diff changeset
    75
    iNotifyInfo = new ( ELeave ) CSSSettingsNotifyInfo;
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
    User::LeaveIfError ( iRSSSettings.Open() );
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
    User::LeaveIfError ( iRCspCache.Open() );
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
    iRSatSession.ConnectL();
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
    iRSatRefresh = new ( ELeave ) RSatRefresh ( *this);
hgs
parents:
diff changeset
    84
    iRSatRefresh->OpenL( iRSatSession );
hgs
parents:
diff changeset
    85
    iRSatRefresh->NotifyFileChangeL();
hgs
parents:
diff changeset
    86
    
hgs
parents:
diff changeset
    87
    if ( FeatureManager::FeatureSupported ( KFeatureIdBtSap ) )
hgs
parents:
diff changeset
    88
        {
hgs
parents:
diff changeset
    89
        //create the active object instance
hgs
parents:
diff changeset
    90
        iBtSapNotifier = CSSSettingsActiveObject::NewL(
hgs
parents:
diff changeset
    91
            KPSUidBluetoothSapConnectionState,
hgs
parents:
diff changeset
    92
            KBTSapConnectionState,
hgs
parents:
diff changeset
    93
            *this );
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
        //subscribe for key event notifications
hgs
parents:
diff changeset
    96
        iBtSapNotifier->NotifyKeyChange();        
hgs
parents:
diff changeset
    97
        }        
hgs
parents:
diff changeset
    98
    __SSSLOGSTRING("[SSS] <--CSSSettingsRefreshHandler::ConstructL");
hgs
parents:
diff changeset
    99
    }
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   102
// CSSSettingsRefreshHandler::NewL
hgs
parents:
diff changeset
   103
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   104
//
hgs
parents:
diff changeset
   105
CSSSettingsRefreshHandler* CSSSettingsRefreshHandler::NewL()
hgs
parents:
diff changeset
   106
    {
hgs
parents:
diff changeset
   107
    __SSSLOGSTRING("[SSS]--> CSSSettingsRefreshHandler::NewL");
hgs
parents:
diff changeset
   108
    CSSSettingsRefreshHandler* self = new( ELeave ) CSSSettingsRefreshHandler;
hgs
parents:
diff changeset
   109
    
hgs
parents:
diff changeset
   110
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
   111
    self->ConstructL();
hgs
parents:
diff changeset
   112
    CleanupStack::Pop();
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
    __SSSLOGSTRING("[SSS] <--CSSSettingsRefreshHandler::NewL");
hgs
parents:
diff changeset
   115
    return self;
hgs
parents:
diff changeset
   116
    }
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   119
// CSSSettingsRefreshHandler::~CSSSettingsRefreshHandler
hgs
parents:
diff changeset
   120
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   121
//
hgs
parents:
diff changeset
   122
CSSSettingsRefreshHandler::~CSSSettingsRefreshHandler()
hgs
parents:
diff changeset
   123
    {
hgs
parents:
diff changeset
   124
    __SSSLOGSTRING("[SSS]--> CSSSettingsRefreshHandler::~CSSSettingsRefreshHandler");
hgs
parents:
diff changeset
   125
    if ( iRSatRefresh )
hgs
parents:
diff changeset
   126
        {
hgs
parents:
diff changeset
   127
        iRSatRefresh->Cancel();
hgs
parents:
diff changeset
   128
        iRSatRefresh->Close();
hgs
parents:
diff changeset
   129
        delete iRSatRefresh;
hgs
parents:
diff changeset
   130
        iRSatRefresh = NULL;
hgs
parents:
diff changeset
   131
        }
hgs
parents:
diff changeset
   132
    iRSatSession.Close();
hgs
parents:
diff changeset
   133
    iRSSSettings.Close();
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
    delete iNotifyInfo;
hgs
parents:
diff changeset
   136
    iNotifyInfo = NULL;
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
    if ( FeatureManager::FeatureSupported ( KFeatureIdBtSap ) )
hgs
parents:
diff changeset
   139
        {
hgs
parents:
diff changeset
   140
        if( iBtSapNotifier )
hgs
parents:
diff changeset
   141
            {
hgs
parents:
diff changeset
   142
            iBtSapNotifier->CancelNotify();
hgs
parents:
diff changeset
   143
            }
hgs
parents:
diff changeset
   144
        delete iBtSapNotifier;
hgs
parents:
diff changeset
   145
        } 
hgs
parents:
diff changeset
   146
        
hgs
parents:
diff changeset
   147
    iRCspCache.Close();
hgs
parents:
diff changeset
   148
               
hgs
parents:
diff changeset
   149
    __SSSLOGSTRING("[SSS] <--CSSSettingsRefreshHandler::~CSSSettingsRefreshHandler");
hgs
parents:
diff changeset
   150
    }
hgs
parents:
diff changeset
   151
hgs
parents:
diff changeset
   152
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   153
// CSSSettingsRefreshHandler::NotifyFileChangeL
hgs
parents:
diff changeset
   154
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   155
//
hgs
parents:
diff changeset
   156
void CSSSettingsRefreshHandler::NotifyFileChangeL(
hgs
parents:
diff changeset
   157
    MSSSettingsRefreshObserver& aObserver,
hgs
parents:
diff changeset
   158
    TSatElementaryFiles aObservedFiles,
hgs
parents:
diff changeset
   159
    TSatRefreshType aObservedRefreshType )
hgs
parents:
diff changeset
   160
    {
hgs
parents:
diff changeset
   161
    __SSSLOGSTRING("[SSS]--> CSSSettingsRefreshHandler::NotifyFileChangeL");
hgs
parents:
diff changeset
   162
    // Update variables.
hgs
parents:
diff changeset
   163
    iNotifyInfo->iObserver = &aObserver;
hgs
parents:
diff changeset
   164
    iNotifyInfo->iObservedFile = aObservedFiles;
hgs
parents:
diff changeset
   165
    iNotifyInfo->iObservedRefreshType = aObservedRefreshType;
hgs
parents:
diff changeset
   166
    __SSSLOGSTRING("[SSS] <--CSSSettingsRefreshHandler::NotifyFileChangeL");
hgs
parents:
diff changeset
   167
    }
hgs
parents:
diff changeset
   168
hgs
parents:
diff changeset
   169
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   170
// CSSSettingsRefreshHandler::CancelNotify
hgs
parents:
diff changeset
   171
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   172
//
hgs
parents:
diff changeset
   173
void CSSSettingsRefreshHandler::CancelNotify()
hgs
parents:
diff changeset
   174
    {
hgs
parents:
diff changeset
   175
    iNotifyInfo->iObserver = NULL;    
hgs
parents:
diff changeset
   176
    }
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   179
// CSSSettingsRefreshHandler::ChangedCspTable
hgs
parents:
diff changeset
   180
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   181
//
hgs
parents:
diff changeset
   182
TInt CSSSettingsRefreshHandler::ChangedCspTable( 
hgs
parents:
diff changeset
   183
    TDes8& aChangedCsps,
hgs
parents:
diff changeset
   184
    TDes8& aNewValues )
hgs
parents:
diff changeset
   185
    {
hgs
parents:
diff changeset
   186
    __SSSLOGSTRING("[SSS]--> CSSSettingsRefreshHandler::ChangedCspTable");
hgs
parents:
diff changeset
   187
    return iRCspCache.ChangedCspTable( 
hgs
parents:
diff changeset
   188
        aChangedCsps,
hgs
parents:
diff changeset
   189
        aNewValues );    
hgs
parents:
diff changeset
   190
    }
hgs
parents:
diff changeset
   191
hgs
parents:
diff changeset
   192
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   193
// CSSSettingsRefreshHandler::AllowRefresh
hgs
parents:
diff changeset
   194
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   195
//
hgs
parents:
diff changeset
   196
TBool CSSSettingsRefreshHandler::AllowRefresh(
hgs
parents:
diff changeset
   197
    TSatRefreshType aType,
hgs
parents:
diff changeset
   198
    const TSatRefreshFiles& aFiles )
hgs
parents:
diff changeset
   199
    {
hgs
parents:
diff changeset
   200
    __SSSLOGSTRING("[SSS]--> CSSSettingsRefreshHandler::AllowRefresh");
hgs
parents:
diff changeset
   201
    return DoHandleRefresh( aType, aFiles, ESSSettingsAllowRefresh );
hgs
parents:
diff changeset
   202
    }
hgs
parents:
diff changeset
   203
hgs
parents:
diff changeset
   204
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   205
// CSSSettingsRefreshHandler::Refresh
hgs
parents:
diff changeset
   206
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   207
//
hgs
parents:
diff changeset
   208
void CSSSettingsRefreshHandler::Refresh(
hgs
parents:
diff changeset
   209
    TSatRefreshType aType,
hgs
parents:
diff changeset
   210
    const TSatRefreshFiles& aFiles )
hgs
parents:
diff changeset
   211
    {
hgs
parents:
diff changeset
   212
    __SSSLOGSTRING("[SSS]--> CSSSettingsRefreshHandler::Refresh");
hgs
parents:
diff changeset
   213
    DoHandleRefresh(  aType, aFiles, ESSSettingsRefresh );
hgs
parents:
diff changeset
   214
    __SSSLOGSTRING("[SSS] <--CSSSettingsRefreshHandler::Refresh");
hgs
parents:
diff changeset
   215
    }
hgs
parents:
diff changeset
   216
hgs
parents:
diff changeset
   217
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   218
// CSSSettingsRefreshHandler::DoHandleRefresh
hgs
parents:
diff changeset
   219
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   220
//
hgs
parents:
diff changeset
   221
TBool CSSSettingsRefreshHandler::DoHandleRefresh(
hgs
parents:
diff changeset
   222
    TSatRefreshType aType,
hgs
parents:
diff changeset
   223
    const TSatRefreshFiles& aFiles,
hgs
parents:
diff changeset
   224
    const TSSSettingsRefreshFunction aFunctionality )
hgs
parents:
diff changeset
   225
    {    
hgs
parents:
diff changeset
   226
    __SSSLOGSTRING("[SSS]--> CSSSettingsRefreshHandler::DoHandleRefresh");
hgs
parents:
diff changeset
   227
    if ( aFunctionality == ESSSettingsRefresh )
hgs
parents:
diff changeset
   228
        {
hgs
parents:
diff changeset
   229
        // Refresh handling needed only if the refresh has happened.
hgs
parents:
diff changeset
   230
        iRCspCache.HandleRefresh();
hgs
parents:
diff changeset
   231
        iRSSSettings.HandleRefresh();
hgs
parents:
diff changeset
   232
        }
hgs
parents:
diff changeset
   233
hgs
parents:
diff changeset
   234
    TBool cspEfFound =  
hgs
parents:
diff changeset
   235
        aFiles.Locate( KCsp1Ef ) != KErrNotFound || 
hgs
parents:
diff changeset
   236
        aFiles.Locate( KCsp2Ef ) != KErrNotFound; 
hgs
parents:
diff changeset
   237
hgs
parents:
diff changeset
   238
    // KCspEf is no longer provided by SAT but GS and PS seem to depend on it, 
hgs
parents:
diff changeset
   239
    // handled here for now. 
hgs
parents:
diff changeset
   240
    TBool fileFound =  
hgs
parents:
diff changeset
   241
        aFiles.Locate( iNotifyInfo->iObservedFile ) != KErrNotFound || 
hgs
parents:
diff changeset
   242
        cspEfFound && iNotifyInfo->iObservedFile == KCspEf; 
hgs
parents:
diff changeset
   243
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
    // By default refresh is allowed.
hgs
parents:
diff changeset
   246
    TBool allow(ETrue);
hgs
parents:
diff changeset
   247
hgs
parents:
diff changeset
   248
    // Handle only if there is observer.
hgs
parents:
diff changeset
   249
    if ( iNotifyInfo->iObserver )
hgs
parents:
diff changeset
   250
        {
hgs
parents:
diff changeset
   251
        // Handle only if observer wants to listen this event.
hgs
parents:
diff changeset
   252
        if ( iNotifyInfo->iObservedRefreshType & aType )
hgs
parents:
diff changeset
   253
            {
hgs
parents:
diff changeset
   254
            if ( aType != EFileChangeNotification || fileFound )
hgs
parents:
diff changeset
   255
                {
hgs
parents:
diff changeset
   256
                if ( aFunctionality == ESSSettingsRefresh )
hgs
parents:
diff changeset
   257
                    {
hgs
parents:
diff changeset
   258
                    // Inform the observer about the refresh event.
hgs
parents:
diff changeset
   259
                    iNotifyInfo->iObserver->Refresh(
hgs
parents:
diff changeset
   260
                        aType, iNotifyInfo->iObservedFile );
hgs
parents:
diff changeset
   261
                    iRSatRefresh->RefreshEFRead( cspEfFound );
hgs
parents:
diff changeset
   262
                    }
hgs
parents:
diff changeset
   263
                else // ESSSettingsAllowRefresh
hgs
parents:
diff changeset
   264
                    {
hgs
parents:
diff changeset
   265
                    // Inform the observer about the coming refresh event.
hgs
parents:
diff changeset
   266
                    allow = iNotifyInfo->iObserver->AllowRefresh(
hgs
parents:
diff changeset
   267
                        aType, iNotifyInfo->iObservedFile );
hgs
parents:
diff changeset
   268
                    }
hgs
parents:
diff changeset
   269
                }
hgs
parents:
diff changeset
   270
            
hgs
parents:
diff changeset
   271
            // If there is no client listening changed files SSSettings has to
hgs
parents:
diff changeset
   272
            // check if some CSP file is into the list and send right response
hgs
parents:
diff changeset
   273
            // since itself reads CSP files.    
hgs
parents:
diff changeset
   274
            if ( !fileFound )
hgs
parents:
diff changeset
   275
            	{
hgs
parents:
diff changeset
   276
                iRSatRefresh->RefreshEFRead( !cspEfFound );
hgs
parents:
diff changeset
   277
                }
hgs
parents:
diff changeset
   278
            }
hgs
parents:
diff changeset
   279
        else
hgs
parents:
diff changeset
   280
            {
hgs
parents:
diff changeset
   281
            iRSatRefresh->RefreshEFRead( EFalse );
hgs
parents:
diff changeset
   282
            }
hgs
parents:
diff changeset
   283
        }
hgs
parents:
diff changeset
   284
    else if ( aType == EFileChangeNotification 
hgs
parents:
diff changeset
   285
        || aType == ESimInitFileChangeNotification 
hgs
parents:
diff changeset
   286
        || aType == ESimInit )
hgs
parents:
diff changeset
   287
        {
hgs
parents:
diff changeset
   288
        iRSatRefresh->RefreshEFRead( !cspEfFound );
hgs
parents:
diff changeset
   289
        }
hgs
parents:
diff changeset
   290
    else 
hgs
parents:
diff changeset
   291
        {
hgs
parents:
diff changeset
   292
        // Do nothing
hgs
parents:
diff changeset
   293
        }
hgs
parents:
diff changeset
   294
    	    	
hgs
parents:
diff changeset
   295
    __SSSLOGSTRING("[SSS] <--CSSSettingsRefreshHandler::DoHandleRefresh");
hgs
parents:
diff changeset
   296
    return allow;
hgs
parents:
diff changeset
   297
    }
hgs
parents:
diff changeset
   298
hgs
parents:
diff changeset
   299
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   300
// CSSSettingsRefreshHandler::HandlePubSubNotify
hgs
parents:
diff changeset
   301
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   302
//
hgs
parents:
diff changeset
   303
void CSSSettingsRefreshHandler::HandlePubSubNotify( const TUid aUid,
hgs
parents:
diff changeset
   304
    const TUint32 aKeyId )
hgs
parents:
diff changeset
   305
    {
hgs
parents:
diff changeset
   306
    __SSSLOGSTRING("[SSS]--> CSSSettingsRefreshHandler::HandlePubSubNotify");
hgs
parents:
diff changeset
   307
    if ( aUid == KPSUidBluetoothSapConnectionState && 
hgs
parents:
diff changeset
   308
         aKeyId == KBTSapConnectionState )
hgs
parents:
diff changeset
   309
        {
hgs
parents:
diff changeset
   310
        TInt btSapState(EBTSapNotConnected);
hgs
parents:
diff changeset
   311
        //get the current SAP state
hgs
parents:
diff changeset
   312
        RProperty::Get( aUid, aKeyId, btSapState );
hgs
parents:
diff changeset
   313
        if ( btSapState == EBTSapNotConnected )
hgs
parents:
diff changeset
   314
            {
hgs
parents:
diff changeset
   315
            // Refresh handling needed only if the BT SAP 
hgs
parents:
diff changeset
   316
            // state is not connected.
hgs
parents:
diff changeset
   317
            iRCspCache.HandleRefresh();
hgs
parents:
diff changeset
   318
            iRSSSettings.HandleRefresh();
hgs
parents:
diff changeset
   319
            }
hgs
parents:
diff changeset
   320
        __SSSLOGSTRING1("[SSS]    HandlePubSubNotify: btSapState: %d", btSapState);
hgs
parents:
diff changeset
   321
        }
hgs
parents:
diff changeset
   322
    __SSSLOGSTRING("[SSS] <--CSSSettingsRefreshHandler::HandlePubSubNotify");
hgs
parents:
diff changeset
   323
    }
hgs
parents:
diff changeset
   324
hgs
parents:
diff changeset
   325
hgs
parents:
diff changeset
   326
//  End of File