locationmanager/tagcreator/src/ctagcreator.cpp
author hgs
Wed, 06 Oct 2010 15:08:08 +0300
changeset 60 79f826a55db2
parent 38 5210ffae7137
permissions -rw-r--r--
201039
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 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:  A class for creating country and city tags for media files
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include "ctagcreator.h"
hgs
parents:
diff changeset
    19
#include "locationmanagerdebug.h"
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#include "mdccommon.h"
hgs
parents:
diff changeset
    22
#include "mdeobjectdef.h"
hgs
parents:
diff changeset
    23
#include "mdepropertydef.h"
hgs
parents:
diff changeset
    24
#include "mderelation.h"
hgs
parents:
diff changeset
    25
#include "mdequery.h"
hgs
parents:
diff changeset
    26
#include "mdeconstants.h"
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
using namespace MdeConstants;
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
_LIT ( KCountry, "country:");   // country:finland
hgs
parents:
diff changeset
    31
_LIT ( KCity, "city:");         // city:helsinki|country:finland
hgs
parents:
diff changeset
    32
_LIT ( KSeparator, "|" );       // Separator for city tag. Separate city and country.
60
hgs
parents: 38
diff changeset
    33
_LIT ( KUnMappedLocation, " " ); //a blank title for geocoordinates that could not be mapped to a valid location
38
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    36
// CTagCreator::NewL
hgs
parents:
diff changeset
    37
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    38
//
hgs
parents:
diff changeset
    39
EXPORT_C CTagCreator* CTagCreator::NewL( )
hgs
parents:
diff changeset
    40
    {
hgs
parents:
diff changeset
    41
    LOG( "CTagCreator::NewL(), begin" );
hgs
parents:
diff changeset
    42
    CTagCreator* self = new (ELeave) CTagCreator( );
hgs
parents:
diff changeset
    43
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    44
    self->ConstructL();
hgs
parents:
diff changeset
    45
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    46
    LOG( "CTagCreator::NewL(), end" );
hgs
parents:
diff changeset
    47
    return self;
hgs
parents:
diff changeset
    48
    }
hgs
parents:
diff changeset
    49
        
hgs
parents:
diff changeset
    50
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    51
// CTagCreator::CTagCreator
hgs
parents:
diff changeset
    52
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    53
//  
hgs
parents:
diff changeset
    54
CTagCreator::CTagCreator(  ) 
hgs
parents:
diff changeset
    55
    {
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
    }
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    60
// CTagCreator::ConstructL
hgs
parents:
diff changeset
    61
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    62
//    
hgs
parents:
diff changeset
    63
void CTagCreator::ConstructL()
hgs
parents:
diff changeset
    64
    {
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
// CTagCreator::~CTagCreator
hgs
parents:
diff changeset
    70
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    71
//    
hgs
parents:
diff changeset
    72
CTagCreator::~CTagCreator()
hgs
parents:
diff changeset
    73
    {
hgs
parents:
diff changeset
    74
  		
hgs
parents:
diff changeset
    75
    }
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    78
// CTagCreator::SetMdeSession()
hgs
parents:
diff changeset
    79
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    80
//
hgs
parents:
diff changeset
    81
EXPORT_C void CTagCreator::SetSession(CMdESession* aSession)
hgs
parents:
diff changeset
    82
    {
hgs
parents:
diff changeset
    83
    iMdeSession = aSession;
hgs
parents:
diff changeset
    84
    }
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    87
// CTagCreator::CreateTagForCountryL() 
hgs
parents:
diff changeset
    88
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    89
//
hgs
parents:
diff changeset
    90
void CTagCreator::CreateTagForCountryL( const TPtrC& aCountry, 
hgs
parents:
diff changeset
    91
                        TItemId& aCountryTagId )
hgs
parents:
diff changeset
    92
    {
hgs
parents:
diff changeset
    93
    LOG( "CTagCreator::CreateTagForCountryL - begin" );
60
hgs
parents: 38
diff changeset
    94
hgs
parents: 38
diff changeset
    95
        // Crete new string for uri, -> country:India.
hgs
parents: 38
diff changeset
    96
        TUint totalLength = ( aCountry.Length() + KCountry().Length() );
hgs
parents: 38
diff changeset
    97
        HBufC* buf = HBufC::NewLC( totalLength );
hgs
parents: 38
diff changeset
    98
        TPtr uriPtr = buf->Des();
hgs
parents: 38
diff changeset
    99
        _LIT(KCountryUriFormat, "%S%S");
hgs
parents: 38
diff changeset
   100
        uriPtr.Format(KCountryUriFormat, &(KCountry()), &aCountry); 
hgs
parents: 38
diff changeset
   101
        
hgs
parents: 38
diff changeset
   102
        // Check if there is allready tag for current country.
hgs
parents: 38
diff changeset
   103
        aCountryTagId = TagExistsL( uriPtr );
hgs
parents: 38
diff changeset
   104
           
hgs
parents: 38
diff changeset
   105
        if( !aCountryTagId )
hgs
parents: 38
diff changeset
   106
           {
hgs
parents: 38
diff changeset
   107
            // No tag, create tag for country.
hgs
parents: 38
diff changeset
   108
            if(aCountry.Length()> 0)
hgs
parents: 38
diff changeset
   109
                {
hgs
parents: 38
diff changeset
   110
                	//Valid country name
hgs
parents: 38
diff changeset
   111
                aCountryTagId = CreateTagL( aCountry, uriPtr, MdeConstants::Tag::ESystemDefineCountryTags);
hgs
parents: 38
diff changeset
   112
                }
hgs
parents: 38
diff changeset
   113
            else
hgs
parents: 38
diff changeset
   114
                {
hgs
parents: 38
diff changeset
   115
                	//No valid country name. So create a tag of type EUnMappedLocationTags
hgs
parents: 38
diff changeset
   116
                aCountryTagId = CreateTagL( aCountry, uriPtr, MdeConstants::Tag::EUnMappedLocationTags);
hgs
parents: 38
diff changeset
   117
                }
hgs
parents: 38
diff changeset
   118
           }  
hgs
parents: 38
diff changeset
   119
          
hgs
parents: 38
diff changeset
   120
        CleanupStack::PopAndDestroy( buf );
hgs
parents: 38
diff changeset
   121
hgs
parents: 38
diff changeset
   122
38
hgs
parents:
diff changeset
   123
    LOG( "CTagCreator::CreateTagForCountryL - end" );
hgs
parents:
diff changeset
   124
    }
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   127
// CTagCreator::CreateTagForCityL() 
hgs
parents:
diff changeset
   128
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   129
//
hgs
parents:
diff changeset
   130
void CTagCreator::CreateTagForCityL( const TPtrC& aCountry, const TPtrC& aCity, TItemId& aCityTagId )
hgs
parents:
diff changeset
   131
    {
hgs
parents:
diff changeset
   132
    LOG( "CTagCreator::CreateTagForCityL - begin" );
60
hgs
parents: 38
diff changeset
   133
        // Crete new string for uri, -> city:bangalore|country:india
hgs
parents: 38
diff changeset
   134
        TUint totalLength = ( aCity.Length() + KCity.iTypeLength +
hgs
parents: 38
diff changeset
   135
            aCountry.Length() + KCountry.iTypeLength + KSeparator.iTypeLength );
hgs
parents: 38
diff changeset
   136
        
hgs
parents: 38
diff changeset
   137
        HBufC* buf = HBufC::NewLC( totalLength );
hgs
parents: 38
diff changeset
   138
        TPtr uriPtr = buf->Des();
hgs
parents: 38
diff changeset
   139
        _LIT(KCityCountryUriFormat, "%S%S%S%S%S");
hgs
parents: 38
diff changeset
   140
        uriPtr.Format(KCityCountryUriFormat,
hgs
parents: 38
diff changeset
   141
                        &(KCity()),
hgs
parents: 38
diff changeset
   142
                        &aCity,
hgs
parents: 38
diff changeset
   143
                        &(KSeparator()),
hgs
parents: 38
diff changeset
   144
                        &(KCountry()),
hgs
parents: 38
diff changeset
   145
                        &aCountry);
hgs
parents: 38
diff changeset
   146
            
hgs
parents: 38
diff changeset
   147
        // Check if there is allready tag for current city.
hgs
parents: 38
diff changeset
   148
        aCityTagId = TagExistsL( uriPtr );
38
hgs
parents:
diff changeset
   149
        
60
hgs
parents: 38
diff changeset
   150
        if( !aCityTagId )
hgs
parents: 38
diff changeset
   151
            {
hgs
parents: 38
diff changeset
   152
               // No tag, create tag for city.
hgs
parents: 38
diff changeset
   153
            if(aCity.Length() > 0)
hgs
parents: 38
diff changeset
   154
                {
hgs
parents: 38
diff changeset
   155
                	//Valid city name
hgs
parents: 38
diff changeset
   156
                aCityTagId = CreateTagL( aCity, uriPtr, MdeConstants::Tag::ESystemDefineCityTags);
hgs
parents: 38
diff changeset
   157
                }
hgs
parents: 38
diff changeset
   158
            else
hgs
parents: 38
diff changeset
   159
                {  
hgs
parents: 38
diff changeset
   160
                	//No valid city name. So create a tag of type EUnMappedLocationTags
hgs
parents: 38
diff changeset
   161
                aCityTagId = CreateTagL( aCity, uriPtr, MdeConstants::Tag::EUnMappedLocationTags);
hgs
parents: 38
diff changeset
   162
                }
hgs
parents: 38
diff changeset
   163
            }
hgs
parents: 38
diff changeset
   164
        
hgs
parents: 38
diff changeset
   165
        CleanupStack::PopAndDestroy( buf );
38
hgs
parents:
diff changeset
   166
 
hgs
parents:
diff changeset
   167
    LOG( "CTagCreator::CreateTagForCityL - end" );
hgs
parents:
diff changeset
   168
    }
hgs
parents:
diff changeset
   169
hgs
parents:
diff changeset
   170
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   171
// CTagCreator::CreateTagL 
hgs
parents:
diff changeset
   172
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   173
//
hgs
parents:
diff changeset
   174
TUint32 CTagCreator::CreateTagL( const TPtrC& aTitle, 
hgs
parents:
diff changeset
   175
        const TPtrC& aUri,
hgs
parents:
diff changeset
   176
        MdeConstants::Tag::TTagType aTagType)
hgs
parents:
diff changeset
   177
    {
hgs
parents:
diff changeset
   178
    LOG( "CTagCreator::CreateTagL - begin" );
hgs
parents:
diff changeset
   179
hgs
parents:
diff changeset
   180
    CMdENamespaceDef& defaultNamespace = iMdeSession->GetDefaultNamespaceDefL();
hgs
parents:
diff changeset
   181
    // Create tag object.
hgs
parents:
diff changeset
   182
    CMdEObjectDef& tagObjectDef = defaultNamespace.GetObjectDefL( Tag::KTagObject );
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
	CMdEObject* tagObject = NULL;
hgs
parents:
diff changeset
   185
    tagObject = iMdeSession->NewObjectLC( tagObjectDef, aUri );
hgs
parents:
diff changeset
   186
	
hgs
parents:
diff changeset
   187
	// Type defs.
hgs
parents:
diff changeset
   188
	CMdEPropertyDef& creationDef = tagObjectDef.GetPropertyDefL(
hgs
parents:
diff changeset
   189
		Object::KCreationDateProperty );
hgs
parents:
diff changeset
   190
	CMdEPropertyDef& modifiedDef = tagObjectDef.GetPropertyDefL(
hgs
parents:
diff changeset
   191
		Object::KLastModifiedDateProperty );
hgs
parents:
diff changeset
   192
	CMdEPropertyDef& sizeDef = tagObjectDef.GetPropertyDefL(
hgs
parents:
diff changeset
   193
		Object::KSizeProperty );
hgs
parents:
diff changeset
   194
	CMdEPropertyDef& itemTypeDef = tagObjectDef.GetPropertyDefL(
hgs
parents:
diff changeset
   195
		Object::KItemTypeProperty );
hgs
parents:
diff changeset
   196
	CMdEPropertyDef& titleDef = tagObjectDef.GetPropertyDefL(
hgs
parents:
diff changeset
   197
		Object::KTitleProperty );
hgs
parents:
diff changeset
   198
	
hgs
parents:
diff changeset
   199
	// Set propertys.
hgs
parents:
diff changeset
   200
	TTime universalTime;
hgs
parents:
diff changeset
   201
    universalTime.UniversalTime(); 
hgs
parents:
diff changeset
   202
hgs
parents:
diff changeset
   203
    // Creation time.
hgs
parents:
diff changeset
   204
	tagObject->AddTimePropertyL( creationDef, universalTime );   
hgs
parents:
diff changeset
   205
hgs
parents:
diff changeset
   206
    // Modification time.
hgs
parents:
diff changeset
   207
	tagObject->AddTimePropertyL( modifiedDef, universalTime );
hgs
parents:
diff changeset
   208
hgs
parents:
diff changeset
   209
    // Size 
hgs
parents:
diff changeset
   210
	tagObject->AddUint32PropertyL( sizeDef, aTagType); 
hgs
parents:
diff changeset
   211
	
hgs
parents:
diff changeset
   212
	// ItemType.
hgs
parents:
diff changeset
   213
	tagObject->AddTextPropertyL( itemTypeDef, Tag::KTagItemType );
hgs
parents:
diff changeset
   214
	
hgs
parents:
diff changeset
   215
	// Title, for country.
hgs
parents:
diff changeset
   216
	if ( aTitle.Length() > 0 )
hgs
parents:
diff changeset
   217
	    {
hgs
parents:
diff changeset
   218
	    tagObject->AddTextPropertyL( titleDef, aTitle ); // Add title
hgs
parents:
diff changeset
   219
	    }
60
hgs
parents: 38
diff changeset
   220
    else
hgs
parents: 38
diff changeset
   221
    	{
hgs
parents: 38
diff changeset
   222
    	tagObject->AddTextPropertyL( titleDef,KUnMappedLocation); // Add empty title
hgs
parents: 38
diff changeset
   223
	   	}
38
hgs
parents:
diff changeset
   224
	
hgs
parents:
diff changeset
   225
	// Finally add to database.
hgs
parents:
diff changeset
   226
	TItemId itemId = iMdeSession->AddObjectL( *tagObject );
hgs
parents:
diff changeset
   227
    
hgs
parents:
diff changeset
   228
    CleanupStack::PopAndDestroy( tagObject );
hgs
parents:
diff changeset
   229
    
hgs
parents:
diff changeset
   230
    LOG( "CTagCreator::CreateTagL - end" );
hgs
parents:
diff changeset
   231
    
hgs
parents:
diff changeset
   232
    return itemId;
hgs
parents:
diff changeset
   233
    }
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   236
// CTagCreator::TagExistsL 
hgs
parents:
diff changeset
   237
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   238
//
hgs
parents:
diff changeset
   239
TUint32 CTagCreator::TagExistsL( const TPtrC& aUri  )
hgs
parents:
diff changeset
   240
    {
hgs
parents:
diff changeset
   241
    LOG( "CTagCreator::TagExistsL - begin" );
hgs
parents:
diff changeset
   242
  
hgs
parents:
diff changeset
   243
    CMdEObject* mdeObject = NULL;
hgs
parents:
diff changeset
   244
    mdeObject = iMdeSession->GetObjectL( aUri ) ; // Just to find out if it exists.
hgs
parents:
diff changeset
   245
    
hgs
parents:
diff changeset
   246
    if( mdeObject )
hgs
parents:
diff changeset
   247
        {
hgs
parents:
diff changeset
   248
        LOG( "CTagCreator::TagExistsL - returning object id" );
hgs
parents:
diff changeset
   249
        return mdeObject->Id();
hgs
parents:
diff changeset
   250
        }
hgs
parents:
diff changeset
   251
    else
hgs
parents:
diff changeset
   252
        {
hgs
parents:
diff changeset
   253
        LOG( "CTagCreator::TagExistsL - No object, return 0" );
hgs
parents:
diff changeset
   254
        return 0;
hgs
parents:
diff changeset
   255
        } 
hgs
parents:
diff changeset
   256
    }
hgs
parents:
diff changeset
   257
    
hgs
parents:
diff changeset
   258
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   259
// CGeoTagger::AttachTagsL 
hgs
parents:
diff changeset
   260
// Create relationship to country and city tag
hgs
parents:
diff changeset
   261
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   262
//
hgs
parents:
diff changeset
   263
EXPORT_C void CTagCreator::AttachTagsL( const TUint32 aObjectId, const TItemId aCountryTagId, 
hgs
parents:
diff changeset
   264
                             const TItemId aCityTagId )
hgs
parents:
diff changeset
   265
    {
hgs
parents:
diff changeset
   266
    LOG( "CGeoTagger::AttachTagsL" );
hgs
parents:
diff changeset
   267
    CMdENamespaceDef& defaultNamespace = iMdeSession->GetDefaultNamespaceDefL();
hgs
parents:
diff changeset
   268
    // contains relation definition
hgs
parents:
diff changeset
   269
    CMdERelationDef& containsRelDef = defaultNamespace.GetRelationDefL(
hgs
parents:
diff changeset
   270
        Relations::KContains );
hgs
parents:
diff changeset
   271
    
hgs
parents:
diff changeset
   272
    // Create relation between country tag and media object (image/video).
hgs
parents:
diff changeset
   273
    CMdERelation* relationObject = NULL;
hgs
parents:
diff changeset
   274
    if ( aCountryTagId )
hgs
parents:
diff changeset
   275
        {
hgs
parents:
diff changeset
   276
        relationObject = iMdeSession->NewRelationLC ( containsRelDef,
hgs
parents:
diff changeset
   277
                aObjectId, aCountryTagId, 0 );
hgs
parents:
diff changeset
   278
        
hgs
parents:
diff changeset
   279
        if ( !relationObject )
hgs
parents:
diff changeset
   280
            {
hgs
parents:
diff changeset
   281
            LOG( "CGeoTagger::AttachTagsL - Couldn't create relation object!" );
hgs
parents:
diff changeset
   282
            User::Leave ( KErrBadHandle );
hgs
parents:
diff changeset
   283
            }
hgs
parents:
diff changeset
   284
        
hgs
parents:
diff changeset
   285
        iMdeSession->AddRelationL( *relationObject );
hgs
parents:
diff changeset
   286
            
hgs
parents:
diff changeset
   287
        CleanupStack::PopAndDestroy( relationObject );
hgs
parents:
diff changeset
   288
        } 
hgs
parents:
diff changeset
   289
    
hgs
parents:
diff changeset
   290
    // Create relation between city tag and media object (image/video). 
hgs
parents:
diff changeset
   291
    if ( aCityTagId )
hgs
parents:
diff changeset
   292
        {
hgs
parents:
diff changeset
   293
        relationObject = iMdeSession->NewRelationLC ( containsRelDef,
hgs
parents:
diff changeset
   294
                    aObjectId, aCityTagId, 0 );
hgs
parents:
diff changeset
   295
        
hgs
parents:
diff changeset
   296
        if ( !relationObject)
hgs
parents:
diff changeset
   297
            {
hgs
parents:
diff changeset
   298
            LOG( "CGeoTagger::AttachTagsL - Couldn't create relation object!" );
hgs
parents:
diff changeset
   299
            User::Leave ( KErrBadHandle );
hgs
parents:
diff changeset
   300
            }
hgs
parents:
diff changeset
   301
        
hgs
parents:
diff changeset
   302
        iMdeSession->AddRelationL( *relationObject );
hgs
parents:
diff changeset
   303
                
hgs
parents:
diff changeset
   304
        CleanupStack::PopAndDestroy( relationObject );
hgs
parents:
diff changeset
   305
        }      
hgs
parents:
diff changeset
   306
hgs
parents:
diff changeset
   307
    LOG( "CGeoTagger::AttachTagsL - end" );
hgs
parents:
diff changeset
   308
    }
hgs
parents:
diff changeset
   309
hgs
parents:
diff changeset
   310
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   311
// CGeoTagger::CreateLocationTagsL 
hgs
parents:
diff changeset
   312
// Create country and city tags
hgs
parents:
diff changeset
   313
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   314
//
hgs
parents:
diff changeset
   315
EXPORT_C void CTagCreator::CreateLocationTagsL( const TPtrC& aCountry, TItemId& aCountryTagId, 
hgs
parents:
diff changeset
   316
                                               const TPtrC& aCity, TItemId& aCityTagId)
hgs
parents:
diff changeset
   317
	{        
hgs
parents:
diff changeset
   318
	LOG( "CGeoTagger::CreateLocationTagsL" );
60
hgs
parents: 38
diff changeset
   319
hgs
parents: 38
diff changeset
   320
    CreateTagForCountryL( aCountry, aCountryTagId );
hgs
parents: 38
diff changeset
   321
    CreateTagForCityL( aCountry, aCity, aCityTagId );
hgs
parents: 38
diff changeset
   322
38
hgs
parents:
diff changeset
   323
	} 
hgs
parents:
diff changeset
   324
   
hgs
parents:
diff changeset
   325
// End of file