diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/filechangenotifier_8cpp-source.html --- a/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/filechangenotifier_8cpp-source.html Tue Mar 30 11:56:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1190 +0,0 @@ - - -TB10.1 Example Applications: examples/Base/FileServer/FileChangeNotifier/src/filechangenotifier.cpp Source File - - - - -

examples/Base/FileServer/FileChangeNotifier/src/filechangenotifier.cpp

00001 // Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
-00002 // All rights reserved.
-00003 // This component and the accompanying materials are made available
-00004 // under the terms of "Eclipse Public License v1.0"
-00005 // which accompanies this distribution, and is available
-00006 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
-00007 //
-00008 // Initial Contributors:
-00009 // Nokia Corporation - initial contribution.
-00010 //
-00011 // Contributors:
-00012 //
-00013 // Description:
-00014 //
-00015 
-00016 #include "filechangenotifier.h"
-00017 
-00018 CChangeNotifier* CChangeNotifier::NewL(TInt aPriority)
-00019     {
-00020     CChangeNotifier* self=new(ELeave)CChangeNotifier(aPriority);
-00021     CleanupStack::PushL(self);
-00022     self->ConstructL();
-00023     CleanupStack::Pop(self);
-00024     return self;
-00025     }
-00026 
-00027 void CChangeNotifier::ConstructL()
-00028     {
-00029     //Create console
-00030     _LIT(KWelcome, "Welcome to File Change Notifier Example\n");
-00031     _LIT(KTextConsoleTitle, "Extended File Change Notifier");
-00032     iConsole = Console::NewL(KTextConsoleTitle, TSize(KConsFullScreen,KConsFullScreen));
-00033     iConsole->Printf(KWelcome);
-00034     
-00035     // Initiate a session by connecting to the File Server
-00036     User::LeaveIfError(iFs.Connect()); 
-00037     // Buffer size for holding the results of completed notifications.
-00038     const TInt KNotificationHeaderSize = (sizeof(TUint16)*2)+(sizeof(TUint));
-00039     const TInt KMinNotificationBufferSize = 2*KNotificationHeaderSize + 2*KMaxFileName;
-00040     
-00041     // Get the system drive on which the file/folder operations can be done.
-00042     int driveNumber = iFs.GetSystemDrive();
-00043     iDrive = (TChar('A'+ driveNumber));
-00044     
-00045     // Create an object for 'CFsNotify' 
-00046     iNotify= CFsNotify::NewL(iFs,KMinNotificationBufferSize);   
-00047     }
-00048 
-00049 CChangeNotifier::CChangeNotifier(TInt aPriority):CActive( aPriority )
-00050     {   
-00051     CActiveScheduler::Add(this);
-00052     }
-00053 
-00057 CChangeNotifier::~CChangeNotifier()
-00058     {
-00059     if(iIsCreateFile)
-00060         {
-00061         TBuf<80> path;
-00062         path.Append(iDrive);
-00063         _LIT(KPath,":\\private\\e80000fb\\filechange\\");
-00064         path.Append(KPath);
-00065                                 
-00066         TBuf<20> filename;
-00067         _LIT(KFileName,"create.file");
-00068         filename.Append(KFileName);
-00069     
-00070         TBuf<80> fullname;
-00071         fullname.Append(path);
-00072         fullname.Append(filename);                  
-00073             
-00074         iFs.Delete(fullname); 
-00075         }
-00076     if(iIsCreateFolder)
-00077         {
-00078         TBuf<80> path;
-00079         path.Append(iDrive);
-00080         _LIT(KPath,":\\private\\e80000fb\\filechange\\createfolder\\");
-00081         path.Append(KPath); 
-00082         iFs.RmDir(path);
-00083         }
-00084     if(!iIsDeleteFile)
-00085         {
-00086         TBuf<80> path;
-00087         path.Append(iDrive);
-00088         _LIT(KPath,":\\private\\e80000fb\\filechange\\deletefolder\\");
-00089         path.Append(KPath);
-00090                                     
-00091         TBuf<20> filename;
-00092         _LIT(KFileName,"file.txt");
-00093         filename.Append(KFileName);
-00094         
-00095         TBuf<80> fullname;
-00096         fullname.Append(path);
-00097         fullname.Append(filename);                  
-00098                 
-00099         iFs.Delete(fullname); 
-00100         }
-00101     if(iIsRenameFile)
-00102         {
-00103         TBuf<80> path;
-00104         path.Append(iDrive);
-00105         _LIT(KPath,":\\private\\e80000fb\\filechange\\");
-00106         path.Append(KPath);
-00107                                     
-00108         TBuf<20> filename;
-00109         _LIT(KFileName,"NewFileName");
-00110         filename.Append(KFileName);
-00111         
-00112         TBuf<80> fullname;
-00113         fullname.Append(path);
-00114         fullname.Append(filename);                  
-00115                 
-00116         iFs.Delete(fullname); 
-00117         }
-00118     
-00119     if(iIsRenameFolder)
-00120         {
-00121         TBuf<80> path;
-00122         path.Append(iDrive);
-00123         _LIT(KPath,":\\private\\e80000fb\\filechange\\RenameFolder\\");
-00124         path.Append(KPath);
-00125         iFs.RmDir(path);
-00126         }
-00127     if(iIsDeleteFolder)
-00128         {
-00129         TBuf<80> path;
-00130         path.Append(iDrive);
-00131         _LIT(KPath,":\\private\\e80000fb\\filechange\\deletefolder\\");
-00132         path.Append(KPath);
-00133         iFs.RmDir(path);
-00134         }
-00135     if(iIsVolumeNameChange)
-00136         {
-00137         TBuf<80> path;
-00138         path.Append('U'); 
-00139         path.Append(_L(":"));
-00140         
-00141         _LIT(KVolumeLabel,"MyDrive");  
-00142         iFs.SetVolumeLabel(KVolumeLabel,iDriveNumber);
-00143         }
-00144     if(iIsMultipleNotifications)
-00145         {      
-00146         // delete file
-00147         TBuf<80> path;
-00148         path.Append(iDrive);
-00149         _LIT(KPath,":\\private\\e80000fb\\filechange\\");
-00150         path.Append(KPath);                                
-00151         TBuf<20> filename;
-00152         filename.Append(_L("rename.file"));
-00153         
-00154         TBuf<80> fullname;
-00155         fullname.Append(path);
-00156         fullname.Append(filename);                  
-00157                 
-00158         iFs.Delete(fullname); 
-00159         }
-00160     delete iConsole;
-00161     delete iNotify;
-00162     iFs.Close();
-00163     }
-00164 
-00165 // The RunL() is called by the Active scheduler.
-00166 void CChangeNotifier::RunL()
-00167     {
-00168     /*
-00169      * When the user chooses an option which is not available in the list of supported features.
-00170      * The Active scheduler is stopped and the application exits.
-00171      */
-00172     if(iOption)
-00173         {
-00174         _LIT(KNotSupported,"\nNot Supported\n");
-00175         iConsole->Printf(KNotSupported);
-00176         CActiveScheduler::Stop();
-00177         }
-00178     else
-00179         {
-00180         /*
-00181          * When the user chooses a Sub-Menu option which is not among the listed options, then 
-00182          * the list of Main options are once again displayed to the user.
-00183          */
-00184         if(iOptionContinue)
-00185             {
-00186             RequestCharacter();
-00187             }
-00188         if(iReqStatus == KErrNone)
-00189             {
-00190             _LIT(KSuccess,"\nSuccessfully completed the posted notifications\n");
-00191             iConsole->Printf(KSuccess);
-00192             if(!iDeleteFileContinue)
-00193                 {
-00194                 if(iIsMultipleNotifications)
-00195                     {                           
-00196                     //Get first notification
-00197                     const TFsNotification* notification = iNotify->NextNotification();
-00198                     TFsNotification::TFsNotificationType notificationType = ((TFsNotification*)notification)->NotificationType();
-00199 
-00200                     //Process Notification
-00201                     ProcessMultipleChanges(notification);
-00202 
-00203                     //Get Next notification
-00204                     notification = iNotify->NextNotification();
-00205 
-00206                     //The operation may not have occurred yet..
-00207                     if(notification == NULL)
-00208                         {
-00209                         iNotify->RequestNotifications(iReqStatus);
-00210                         User::WaitForRequest(iReqStatus); // We need wait for the corresponding file change to complete.
-00211                         notification = iNotify->NextNotification();
-00212                         }
-00213 
-00214                     //Process Notification
-00215                     ProcessMultipleChanges(notification);            
-00216                     }
-00217                     RequestCharacter();
-00218                 }
-00219             else
-00220                 {
-00221                 DeleteFolder();
-00222                 }
-00223             }
-00224         }
-00225     }
-00226 
-00227 /*
-00228  * This method will process the multiple notifications which are completed.
-00229  * Currently, the creation of the file and rename of the file are happening one after another in the DoChanges() Method
-00230  * defined below. Hence the file to be renamed will be created first and then rename operation is done.
-00231  */
-00232 void CChangeNotifier::ProcessMultipleChanges(const TFsNotification* aNotification)
-00233     {
-00234     TFsNotification::TFsNotificationType notificationType = ((TFsNotification*)aNotification)->NotificationType();
-00235 
-00236     if(notificationType == TFsNotification::ECreate) 
-00237         { 
-00238         _LIT(KNewFileCreated,"Notification of successful creation of a new file 'notify.file'\n");
-00239         iConsole->Printf(KNewFileCreated);
-00240         }
-00241     else if (notificationType == TFsNotification::ERename)
-00242         {
-00243         _LIT(KFileRename,"Notification for notify.file being renamed to rename.file ");
-00244         iConsole->Printf(KFileRename);
-00245         }
-00246     }
-00247 /*
-00248  * User gets notified when there is a change in the file. Different kinds of notifications are posted by the 
-00249  * user.
-00250  * 
-00251  * Notifications are recevied for following operations :
-00252  * - Any change in the contents of the particular file.
-00253  * - If any new file is created inside the particular folder.
-00254  * - When a file rename is done.
-00255  * - When the file attributes are changed.
-00256  * - When a particular file is deleted.
-00257  * 
-00258  */
-00259 void CChangeNotifier::NotifyChangeToFile()
-00260     {   
-00261     _LIT(KMenuL1,"\nChoose an option:\n");
-00262     _LIT(KMenuL2,"1.Get notified when a file is created\n");
-00263     _LIT(KMenuL3,"2.Get notified when the file contents change\n");
-00264     _LIT(KMenuL4,"3.Get notified when a file rename occurs\n");
-00265     _LIT(KMenuL5,"4.Get notified when file attributes change\n");
-00266     _LIT(KMenuL6,"5.Get notified when a file is deleted\n");
-00267         
-00268     iConsole->Printf(KMenuL1);
-00269     iConsole->Printf(KMenuL2);
-00270     iConsole->Printf(KMenuL3);
-00271     iConsole->Printf(KMenuL4);
-00272     iConsole->Printf(KMenuL5);
-00273     iConsole->Printf(KMenuL6);
-00274 
-00275     TChar choice = iConsole->Getch();
-00276     switch(choice)
-00277         {
-00278         case '1':
-00279             {
-00280             CreateFile();
-00281             break;
-00282             }
-00283         case '2':
-00284             {
-00285             ChangeFileContents();
-00286             break;
-00287             }
-00288         case '3':
-00289             {
-00290             RenameFile();
-00291             break;
-00292             }
-00293         case '4':
-00294             {
-00295             ChangeFileAttributes ();
-00296             break;
-00297             }
-00298         case '5':
-00299             {
-00300             DeleteFile();
-00301             break;
-00302             }
-00303         default:
-00304             {
-00305             iOption = ETrue;
-00306             _LIT(KPressAnyKey,"Press any key to Exit");
-00307             iConsole->Printf(KPressAnyKey);
-00308             iConsole->Read(iStatus);
-00309             if(!IsActive())
-00310                 {
-00311                 SetActive();
-00312                 } 
-00313             break;
-00314             }
-00315         }        
-00316     }
-00317 
-00318 /*
-00319  * User gets notified when a new file is created with a particular name in a particular folder.
-00320  */
-00321 void CChangeNotifier::CreateFile()
-00322     {   
-00323     if(!iIsCreateFile)
-00324         {
-00325         TBuf<40> path;
-00326         path.Append(iDrive);
-00327         _LIT(KPath,":\\private\\e80000fb\\filechange\\");
-00328         path.Append(KPath);
-00329                             
-00330         TBuf<20> filename;
-00331         _LIT(KFileName,"create.file");
-00332         filename.Append(KFileName);
-00333                             
-00334         TInt err = iNotify->AddNotification((TUint)TFsNotification::ECreate,path,filename);
-00335         if(err == KErrNone)
-00336             {
-00337             _LIT(KSuccess,"\nAdded 'Create File' type notification to  CFsNotify object\n");
-00338             iConsole->Printf(KSuccess);
-00339             }
-00340         else
-00341             {
-00342             _LIT(KSuccess,"Added Notification failed\n");
-00343             iConsole->Printf(KSuccess);
-00344             }
-00345         err = iNotify->RequestNotifications(iReqStatus);
-00346         if(err==KErrNone)
-00347             {
-00348             _LIT(KSuccess,"Request for the above notification is successful\n");
-00349             iConsole->Printf(KSuccess);
-00350             }                       
-00351 
-00352         DoChanges(ECreateFile);
-00353         iStatus = iReqStatus; 
-00354         if(!IsActive())
-00355             {
-00356             SetActive();
-00357             }
-00358         iIsCreateFile = ETrue;
-00359         }
-00360     else
-00361         {
-00362         _LIT(KResult,"File already created\n");
-00363         iConsole->Printf(KResult);
-00364         PressAnyKey();
-00365         }
-00366     }
-00367 
-00368 /*
-00369  * User gets notified when the contents of the file change.
-00370  */
-00371 void CChangeNotifier::ChangeFileContents()
-00372     {  
-00373     TBuf<80> path;
-00374     path.Append(iDrive);
-00375     _LIT(KPath,":\\private\\e80000fb\\filechange\\");
-00376     path.Append(KPath);
-00377                             
-00378     TBuf<20> filename;
-00379     _LIT(KFileName,"file.txt");
-00380     filename.Append(KFileName);
-00381                             
-00382     TInt err = iNotify->AddNotification((TUint)TFsNotification::EFileChange,path,filename);
-00383     if(err == KErrNone)
-00384         {
-00385         _LIT(KSuccess,"\nAdded 'File contents change' type notification to  CFsNotify object\n");
-00386         iConsole->Printf(KSuccess);
-00387         }
-00388     else
-00389         {
-00390         _LIT(KSuccess,"Added Notification failed\n");
-00391         iConsole->Printf(KSuccess);
-00392         }
-00393     err = iNotify->RequestNotifications(iReqStatus);
-00394     if(err==KErrNone)
-00395         {
-00396         _LIT(KSuccess,"Request for the above notification is successful\n");
-00397         iConsole->Printf(KSuccess);
-00398         } 
-00399     DoChanges(EChangeFileContents);
-00400     iStatus = iReqStatus; 
-00401     if(!IsActive())
-00402         {
-00403         SetActive();
-00404         } 
-00405     }
-00406 
-00407 /*
-00408  * User gets notified when a file name is changed.
-00409  */
-00410 void CChangeNotifier::RenameFile()
-00411     {
-00412     if(!iIsCreateFile)
-00413         {
-00414         _LIT(KCreateFile,"\nCreating a file so that you can try changing it attributes later\n");
-00415         iConsole->Printf(KCreateFile);
-00416         CreateFile();
-00417         }
-00418     else
-00419         {
-00420         if(!iIsRenameFile)
-00421             {
-00422             TBuf<80> path;
-00423             path.Append(iDrive);
-00424             _LIT(KPath,":\\private\\e80000fb\\filechange\\");
-00425             path.Append(KPath);
-00426             
-00427             TBuf<20> filename;
-00428             _LIT(KFileName,"create.file");
-00429             filename.Append(KFileName);
-00430                             
-00431             TInt err = iNotify->AddNotification((TUint)TFsNotification::ERename,path,filename);
-00432             if(err == KErrNone)
-00433                 {
-00434                 _LIT(KSuccess,"\nAdded 'File rename' type notification to  CFsNotify object\n");
-00435                 iConsole->Printf(KSuccess);
-00436                 }
-00437             else
-00438                 {
-00439                 _LIT(KSuccess,"Added notification failed\n");
-00440                 iConsole->Printf(KSuccess);
-00441                 }
-00442             err = iNotify->RequestNotifications(iReqStatus);
-00443             if(err==KErrNone)
-00444                 {
-00445                 _LIT(KSuccess,"Request for the above notification is successful\n");
-00446                 iConsole->Printf(KSuccess);
-00447                 }
-00448             DoChanges(ERenameFile);          
-00449             iStatus = iReqStatus; 
-00450             if(!IsActive())
-00451                 {
-00452                 SetActive();
-00453                 } 
-00454             iIsRenameFile = ETrue;
-00455             }
-00456         else
-00457             {
-00458             _LIT(KResult,"File rename is already performed\n");
-00459             iConsole->Printf(KResult);
-00460             PressAnyKey();
-00461             } 
-00462         }
-00463     }
-00464 
-00465 /*
-00466  * User gets notified when the file attributes change
-00467  */
-00468 void CChangeNotifier::ChangeFileAttributes()
-00469     { 
-00470     if(!iIsCreateFile)
-00471         {
-00472         _LIT(KCreateFile,"\nCreating a file so that you can try changing it attributes later\n");
-00473         iConsole->Printf(KCreateFile);
-00474         CreateFile();
-00475         }
-00476     else
-00477         {
-00478         if(!iIsChangeFileAttributes )
-00479             {
-00480             TBuf<80> path;
-00481             path.Append(iDrive);
-00482             _LIT(KPath,":\\private\\e80000fb\\filechange\\");
-00483             path.Append(KPath);
-00484                             
-00485             TBuf<20> filename;
-00486             _LIT(KFileName,"create.file");
-00487             filename.Append(KFileName);
-00488                             
-00489             TInt err = iNotify->AddNotification((TUint)TFsNotification::EAttribute,path,filename);
-00490             if(err == KErrNone)
-00491                 {
-00492                 _LIT(KSuccess,"\nAdded 'File attributes change' type notification to  CFsNotify object\n");
-00493                 iConsole->Printf(KSuccess);
-00494                 }
-00495             else
-00496                 {
-00497                 _LIT(KSuccess,"Added Notification failed\n");
-00498                 iConsole->Printf(KSuccess);
-00499                 }
-00500             err = iNotify->RequestNotifications(iReqStatus);
-00501             if(err==KErrNone)
-00502                 {
-00503                 _LIT(KSuccess,"Request for the above notification is successful\n");
-00504                 iConsole->Printf(KSuccess);
-00505                 }
-00506             DoChanges(EChangeFileAttributes );                
-00507             iStatus = iReqStatus; 
-00508             if(!IsActive())
-00509                 {
-00510                 SetActive();
-00511                 } 
-00512             iIsChangeFileAttributes  = ETrue;
-00513             }
-00514         else
-00515             {
-00516             _LIT(KResult,"File attributes already changed\n");
-00517             iConsole->Printf(KResult);
-00518             PressAnyKey();
-00519             }    
-00520         }
-00521     }
-00522 
-00523 /*
-00524  * User gets notified when a file is deleted.
-00525  */
-00526 void CChangeNotifier::DeleteFile()
-00527     { 
-00528     if(!iIsDeleteFile)
-00529         {
-00530         TBuf<80> path;
-00531         path.Append(iDrive);
-00532         _LIT(KPath,":\\private\\e80000fb\\filechange\\deletefolder\\");
-00533         path.Append(KPath);
-00534                             
-00535         TBuf<20> filename;
-00536         _LIT(KFileName,"file.txt");
-00537         filename.Append(KFileName);
-00538                             
-00539         TInt err = iNotify->AddNotification((TUint)TFsNotification::EDelete,path,filename);
-00540         if(err == KErrNone)
-00541             {
-00542             _LIT(KSuccess,"\nAdded 'File Delete' type notification to  CFsNotify object\n");
-00543             iConsole->Printf(KSuccess);
-00544             }
-00545         else
-00546             {
-00547             _LIT(KSuccess,"Add Notification failed\n");
-00548             iConsole->Printf(KSuccess);
-00549             }
-00550         err = iNotify->RequestNotifications(iReqStatus);
-00551         if(err==KErrNone)
-00552             {
-00553             _LIT(KSuccess,"Request for the above notification is successful\n");
-00554             iConsole->Printf(KSuccess);
-00555             }
-00556                         
-00557         DoChanges(EDeleteFile);
-00558         iStatus = iReqStatus; 
-00559         if(!IsActive())
-00560             {
-00561             SetActive();
-00562             }  
-00563         iIsDeleteFile = ETrue;
-00564         }
-00565     else
-00566         {
-00567         _LIT(KResult,"File already deleted\n");
-00568         iConsole->Printf(KResult);
-00569         PressAnyKey();
-00570         }    
-00571     }
-00572 
-00573 /*
-00574  * User gets notified when a folder is created.
-00575  */
-00576 void CChangeNotifier::CreateFolder()
-00577     {   
-00578     if(!iIsCreateFolder)
-00579         {
-00580         TBuf<80> path;
-00581         path.Append(iDrive);
-00582         _LIT(KPath,":\\private\\e80000fb\\filechange\\createfolder\\");
-00583         path.Append(KPath);
-00584                             
-00585         TBuf<10> filename;
-00586         _LIT(KFileName,"*");
-00587         filename.Append(KFileName);
-00588         
-00589         TInt err = iNotify->AddNotification((TUint)TFsNotification::ECreate,path,filename);
-00590         if(err == KErrNone)
-00591             {
-00592             _LIT(KSuccess,"\nAdded 'Create Folder' type notification to  CFsNotify object\n");
-00593             iConsole->Printf(KSuccess);
-00594             }
-00595         else
-00596             {
-00597             _LIT(KSuccess,"Add Notification failed\n");
-00598             iConsole->Printf(KSuccess);
-00599             }
-00600         err = iNotify->RequestNotifications(iReqStatus);
-00601         if(err==KErrNone)
-00602             {
-00603             _LIT(KSuccess,"Request for the above notification is successful\n");
-00604             iConsole->Printf(KSuccess);
-00605             }
-00606                         
-00607         DoChanges(ECreateFolder);
-00608         iStatus = iReqStatus; 
-00609         if(!IsActive())
-00610             {
-00611             SetActive();
-00612             }  
-00613         iIsCreateFolder = ETrue;
-00614         }
-00615         else
-00616             {
-00617             _LIT(KResult,"Folder already created\n");
-00618             iConsole->Printf(KResult);
-00619             PressAnyKey();
-00620             }  
-00621         }
-00622 
-00623 /*
-00624  * User gets notified when a folder rename is done.
-00625  */
-00626 void CChangeNotifier::RenameFolder()
-00627     {   
-00628     if(!iIsRenameFolder)
-00629         {
-00630         TBuf<80> path;
-00631         path.Append(iDrive);
-00632         _LIT(KPath,":\\private\\e80000fb\\filechange\\newfolder\\");
-00633         path.Append(KPath);
-00634         
-00635         TBuf<80> newPath;
-00636         newPath.Append('c');
-00637         _LIT(KPath1,":\\private\\e80000fb\\filechange\\RenameFolder\\");
-00638         newPath.Append(KPath1);
-00639                             
-00640         TBuf<20> filename;
-00641         _LIT(KFileName,"*");
-00642         filename.Append(KFileName);
-00643                             
-00644         TInt err = iNotify->AddNotification((TUint)TFsNotification::ERename,path,filename);
-00645         if(err == KErrNone)
-00646             {
-00647             _LIT(KSuccess,"\nAdded 'Rename Folder' type notification to  CFsNotify object\n");
-00648             iConsole->Printf(KSuccess);
-00649             }
-00650         else
-00651             {
-00652             _LIT(KSuccess,"Add Notification failed\n");
-00653             iConsole->Printf(KSuccess);
-00654             }
-00655         err = iNotify->RequestNotifications(iReqStatus);
-00656         if(err==KErrNone)
-00657             {
-00658             _LIT(KSuccess,"Request for the above notification is successful\n");
-00659             iConsole->Printf(KSuccess);
-00660             }
-00661         DoChanges(ERenameFolder);                
-00662         iStatus = iReqStatus; 
-00663         if(!IsActive())
-00664             {
-00665             SetActive();
-00666             }  
-00667         iIsRenameFolder = ETrue;
-00668         }
-00669     else
-00670         {
-00671         _LIT(KResult,"Folder rename is performed already\n");
-00672         iConsole->Printf(KResult);
-00673         PressAnyKey();
-00674         }  
-00675     }
-00676 
-00677 void CChangeNotifier::DeleteFolder()
-00678     { 
-00679     if(!iIsDeleteFolder)
-00680         {
-00681         TBuf<80> path;
-00682         path.Append(iDrive);
-00683         _LIT(KPath,":\\private\\e80000fb\\filechange\\deletefolder\\");
-00684         path.Append(KPath);
-00685         
-00686         TBuf<20> filename;
-00687         _LIT(KFileName,"*");
-00688         filename.Append(KFileName);
-00689                             
-00690         TInt err = iNotify->AddNotification((TUint)TFsNotification::EDelete ,path,filename);
-00691         if(err == KErrNone)
-00692             {
-00693             _LIT(KSuccess,"\nAdded 'Delete Folder' type notification to  CFsNotify object\n");
-00694             iConsole->Printf(KSuccess);
-00695             }
-00696         else
-00697             {
-00698             _LIT(KSuccess,"Add Notification failed\n");
-00699             iConsole->Printf(KSuccess);
-00700             }
-00701 
-00702         err = iNotify->RequestNotifications(iReqStatus);
-00703         if(err==KErrNone)
-00704             {
-00705             _LIT(KSuccess,"Request for the above notification is successful\n");
-00706             iConsole->Printf(KSuccess);
-00707             }
-00708         DoChanges(EDeleteFolder);
-00709         iStatus = iReqStatus; 
-00710         if(!IsActive())
-00711             {
-00712             SetActive();
-00713             } 
-00714         iIsDeleteFolder = ETrue;
-00715         }
-00716     else
-00717         {
-00718         _LIT(KResult,"Folder is already deleted\n");
-00719         iConsole->Printf(KResult);
-00720         PressAnyKey();
-00721         }
-00722     if(iDeleteFileContinue )
-00723         {
-00724         iDeleteFileContinue = EFalse;
-00725         }
-00726     }
-00727 
-00728 /*
-00729  * User gets notified when a folder is deleted.
-00730  */
-00731 void CChangeNotifier::DeleteFileandFolder()
-00732     { 
-00733         if((!iIsDeleteFile)){
-00734             DeleteFile();
-00735             iDeleteFileContinue = ETrue;
-00736             }
-00737         else{
-00738             DeleteFolder();
-00739             }
-00740     }
-00741 
-00742 /*
-00743  * User gets notified when there is change in Folder.
-00744  */
-00745 void CChangeNotifier::NotifyChangeToFolder()
-00746     {              
-00747     _LIT(KMenuL1,"\nChoose an option:\n");
-00748     _LIT(KMenuL2,"1.Create a Folder\n");
-00749     _LIT(KMenuL3,"2.Rename the Folder\n");
-00750     _LIT(KMenuL4,"3.Delete the Folder\n");
-00751         
-00752     iConsole->Printf(KMenuL1);
-00753     iConsole->Printf(KMenuL2);
-00754     iConsole->Printf(KMenuL3);
-00755     iConsole->Printf(KMenuL4);
-00756 
-00757     TChar choice = iConsole->Getch();
-00758     switch(choice)
-00759         {
-00760         case '1':
-00761             {
-00762             CreateFolder();
-00763             break;
-00764             }
-00765         case '2':
-00766             {
-00767             RenameFolder();
-00768             break;
-00769             }
-00770         case '3':
-00771             {
-00772            DeleteFileandFolder();
-00773             break;
-00774             }
-00775         default:
-00776             {
-00777             iOption = ETrue;
-00778             _LIT(KPressAnyKey,"Press any key to Exit");
-00779             iConsole->Printf(KPressAnyKey);
-00780             iConsole->Read(iStatus);
-00781             if(!IsActive())
-00782                 {
-00783                 SetActive();
-00784                 } 
-00785             break;
-00786             }
-00787         }        
-00788     }
-00789 /*
-00790  * User gets notified when there is a change in the Volume name of a Drive.
-00791  */
-00792 void CChangeNotifier::VolumeNameChange()
-00793     {   
-00794     if(!iIsVolumeNameChange)
-00795         {
-00796         TBuf<5> path;
-00797         path.Append('U'); 
-00798         path.Append(_L(":"));
-00799         TBuf<20> filename;
-00800                             
-00801         TInt err = iNotify->AddNotification((TUint)TFsNotification::EVolumeName,path,filename);
-00802         if(err == KErrNone)
-00803             {
-00804             _LIT(KSuccess,"\nAdded 'Volume name change' type notification to  CFsNotify object\n");
-00805             iConsole->Printf(KSuccess);
-00806             }
-00807         else
-00808             {
-00809             _LIT(KSuccess,"Add Notification failed\n");
-00810             iConsole->Printf(KSuccess);
-00811             }
-00812         err = iNotify->RequestNotifications(iReqStatus);
-00813         if(err==KErrNone)
-00814             {
-00815             _LIT(KSuccess,"Request for the above notification is successful\n");
-00816             iConsole->Printf(KSuccess);
-00817             }
-00818         DoChanges(EVolumeNameChange);
-00819         iStatus = iReqStatus; 
-00820         if(!IsActive())
-00821             {
-00822             SetActive();
-00823             }  
-00824         iIsVolumeNameChange = ETrue;
-00825         }
-00826     else{
-00827         _LIT(KResult,"Volume name already changed\n");
-00828         iConsole->Printf(KResult);
-00829         PressAnyKey();
-00830         } 
-00831     }
-00832 
-00833 
-00834 /*
-00835  * Client receives notifications for multiple notifications requested.
-00836  * 
-00837  * The major differences between the old (RFs::NotifyChange) and new (CFsNotify) frameworks are:
-00838  * The ability to request multiple notifications on differing paths, 
-00839  * notification types,  combinations of paths/notification-types etc..,on the same request.
-00840  * Guarantee that all notifiable operations will be served to the client (no race to re-request notifications). 
-00841  * Client can query the notification to find out what change has occurred (no directory scanning required).
-00842  */
-00843 void CChangeNotifier::MultipleNotifications()
-00844     {
-00845     if(!iIsMultipleNotifications)
-00846         {
-00847         TBuf<40> path;
-00848         path.Append(iDrive);
-00849         _LIT(KPath,":\\private\\e80000fb\\filechange\\");
-00850         path.Append(KPath);
-00851                                
-00852         TBuf<20> filename;
-00853         _LIT(KFileName,"notify.file");
-00854         filename.Append(KFileName);
-00855                                
-00856         TInt err = iNotify->AddNotification((TUint)TFsNotification::ECreate,path,filename);
-00857         if(err == KErrNone)
-00858             {
-00859             _LIT(KSuccess,"\nAdded 'Create File' type notification to  CFsNotify object\n");
-00860             iConsole->Printf(KSuccess);
-00861             }
-00862         else
-00863             {
-00864             _LIT(KSuccess,"Added Notification failed\n");
-00865             iConsole->Printf(KSuccess);
-00866             }
-00867     
-00868         err = iNotify->AddNotification((TUint)TFsNotification::ERename,path,filename);
-00869         if(err == KErrNone)
-00870             {
-00871             _LIT(KSuccess,"\nAdded 'Rename file' type notification to  CFsNotify object\n");
-00872             iConsole->Printf(KSuccess);
-00873             }
-00874         else
-00875             {
-00876             _LIT(KSuccess,"Add Notification failed\n");
-00877             iConsole->Printf(KSuccess);
-00878             }
-00879         iNotify->RequestNotifications(iReqStatus);
-00880         DoChanges(EMultipleNotifications);
-00881         iStatus = iReqStatus; 
-00882         if(!IsActive())
-00883             {
-00884             SetActive();
-00885             }  
-00886         iIsMultipleNotifications = ETrue;
-00887         }
-00888     else
-00889         {
-00890         _LIT(KResult,"Mutliple notifications already done\n");
-00891         iConsole->Printf(KResult);
-00892         PressAnyKey();  
-00893         }
-00894     }
-00895 
-00896 /*
-00897  * Do the file/folder changes as per the notificaiton request posted by the CFsNotify client.
-00898  * After the file/folder changes complete. RunL() will be called, successful completion of the request is displayed in RunL()
-00899  * 
-00900  * Note : The file changes can originate from any thread or a process.
-00901  */
-00902 void CChangeNotifier::DoChanges(CChangeNotifier::TFileOperations aOperation)
-00903     {
-00904     TBuf<80> path;
-00905     TBuf<20> filename;
-00906     TBuf<80> fullname;
-00907     RFile file;
-00908     switch(aOperation)
-00909         {
-00910         case CChangeNotifier::ECreateFile :
-00911             {
-00912             path.Append(iDrive);
-00913             _LIT(KPath,":\\private\\e80000fb\\filechange\\");
-00914             path.Append(KPath);
-00915                                         
-00916             TBuf<20> filename;
-00917             _LIT(KFileName,"create.file");
-00918             filename.Append(KFileName);
-00919                     
-00920             fullname.Append(path);
-00921             fullname.Append(filename);                  
-00922             file.Replace(iFs,fullname,EFileWrite); //Replace produces Create notification
-00923             
-00924             _LIT(KTxtFileChanges,"\nNew file create.file created at %c drive at :\\private\\e80000fb\\filechange\\ location\n");
-00925             iConsole->Printf(KTxtFileChanges,iDrive);
-00926             return;
-00927             }
-00928             
-00929         case CChangeNotifier::EChangeFileContents :
-00930             {
-00931             path.Append(iDrive);
-00932             _LIT(KPath,":\\private\\e80000fb\\filechange\\");
-00933             path.Append(KPath);    
-00934             _LIT(KFileName,"file.txt");
-00935             filename.Append(KFileName);
-00936             fullname.Append(path);
-00937             fullname.Append(filename);                  
-00938             file.Replace(iFs,fullname,EFileWrite); //Replace produces Create notification
-00939             _LIT8(KFileData,"Some Data");
-00940             file.Write(KFileData);
-00941             
-00942             _LIT(KTxtFileChanges,"\nfile contents of file.txt at %c drive at :\\private\\e80000fb\\filechange\\ location has changed\n");
-00943             iConsole->Printf(KTxtFileChanges,iDrive);
-00944             return;
-00945             }
-00946             
-00947         case CChangeNotifier::ERenameFile :
-00948             {
-00949             path.Append(iDrive);
-00950             _LIT(KPath,":\\private\\e80000fb\\filechange\\");
-00951             path.Append(KPath);  
-00952             _LIT(KFileName,"create.file");
-00953             filename.Append(KFileName);
-00954             fullname.Append(path);
-00955             fullname.Append(filename); 
-00956 
-00957             file.Replace(iFs,fullname,EFileWrite); //Replace produces Create notification
-00958             _LIT(KRenameFile,"NewFileName");
-00959             file.Rename(KRenameFile);
-00960             
-00961             _LIT(KTxtFileChanges,"\ncreate.file at %c drive at :\\private\\e80000fb\\filechange\\ location has been renamed to NewFileName\n");
-00962             iConsole->Printf(KTxtFileChanges,iDrive);
-00963             return;
-00964             }
-00965             
-00966         case CChangeNotifier::EChangeFileAttributes  :
-00967             {
-00968             path.Append(iDrive);
-00969             _LIT(KPath,":\\private\\e80000fb\\filechange\\");
-00970             path.Append(KPath);
-00971             _LIT(KFileName,"create.file");
-00972             filename.Append(KFileName);
-00973             fullname.Append(path);
-00974             fullname.Append(filename);                  
-00975             file.Replace(iFs,fullname,EFileWrite); //Replace produces Create notification
-00976             file.SetSize(134);
-00977             
-00978             _LIT(KTxtFileChanges,"\ncreate.file at %c drive at :\\private\\e80000fb\\filechange\\ location has it attributes changed to 134bytes\n");
-00979             iConsole->Printf(KTxtFileChanges,iDrive);
-00980             return;
-00981             }
-00982         case CChangeNotifier::EDeleteFile :
-00983             {
-00984             path.Append(iDrive);
-00985             _LIT(KPath,":\\private\\e80000fb\\filechange\\deletefolder\\");
-00986             path.Append(KPath); 
-00987             _LIT(KFileName,"file.txt");
-00988             filename.Append(KFileName);
-00989             fullname.Append(path);
-00990             fullname.Append(filename);                                      
-00991             iFs.Delete(fullname);
-00992             
-00993             _LIT(KTxtFileChanges,"\nfile.txt at %c drive at :\\private\\e80000fb\\filechange\\deletefolder\\ location has been deleted\n");
-00994             iConsole->Printf(KTxtFileChanges,iDrive);
-00995             return;
-00996             }
-00997         case CChangeNotifier::ECreateFolder :
-00998             {
-00999             path.Append(iDrive);
-01000             _LIT(KPath,":\\private\\e80000fb\\filechange\\createfolder\\");
-01001             path.Append(KPath);                                         
-01002             iFs.MkDir(path);
-01003             
-01004             _LIT(KTxtFileChanges,"\nA new folder 'createfolder' at %c drive at :\\private\\e80000fb\\filechange\\ location has been created\n");
-01005             iConsole->Printf(KTxtFileChanges,iDrive);
-01006             return;
-01007             }
-01008         case CChangeNotifier::ERenameFolder :
-01009             {
-01010             path.Append(iDrive);
-01011             _LIT(KPath,"\\private\\e80000fb\\filechange\\newfolder\\");
-01012             path.Append(KPath);
-01013             
-01014             TBuf<80> newPath;
-01015             newPath.Append(iDrive);
-01016             _LIT(KNewPath,"\\private\\e80000fb\\filechange\\RenameFolder\\");
-01017             newPath.Append(KNewPath);   
-01018             iFs.Rename(path,newPath);
-01019             
-01020             _LIT(KTxtFileChanges,"\nnewfolder at %c drive at :\\private\\e80000fb\\filechange\\ location has been renamed to RenameFolder\n");
-01021             iConsole->Printf(KTxtFileChanges,iDrive);
-01022             return;
-01023             }
-01024         case CChangeNotifier::EDeleteFolder :
-01025             {
-01026             path.Append('U');
-01027             _LIT(KPath,":\\private\\e80000fb\\filechange\\deletefolder\\");
-01028             path.Append(KPath);        
-01029             iFs.RmDir(path);
-01030             
-01031             _LIT(KTxtFileChanges,"\ndeletefolder at %c drive at :\\private\\e80000fb\\filechange\\ location has been deleted\n");
-01032             iConsole->Printf(KTxtFileChanges,iDrive);
-01033             return;
-01034             }
-01035         case CChangeNotifier::EVolumeNameChange :
-01036             {
-01037             _LIT(KVolumeLabel,"MyNewDrive");  
-01038             iDriveNumber = (TChar)'U'- (TChar)'A';
-01039             iFs.SetVolumeLabel(KVolumeLabel,iDriveNumber);
-01040             _LIT(KResult,"Volume name changed to MyNewDrive \n");
-01041             iConsole->Printf(KResult);
-01042             return;
-01043             }
-01044         case CChangeNotifier::EMultipleNotifications :
-01045             {
-01046             // Create a file 'notify.file'
-01047             path.Append(iDrive);
-01048             _LIT(KPath,":\\private\\e80000fb\\filechange\\");
-01049             path.Append(KPath);
-01050                                                            
-01051             TBuf<20> filename;
-01052             _LIT(KFileName,"notify.file");
-01053             filename.Append(KFileName);
-01054                                        
-01055             fullname.Append(path);
-01056             fullname.Append(filename);                  
-01057             file.Replace(iFs,fullname,EFileWrite); //Replace produces Create notification
-01058                                
-01059             _LIT(KTxtFileChanges,"\nNew file notify.file created at %c drive at :\\private\\e80000fb\\filechange\\ location\n");
-01060             iConsole->Printf(KTxtFileChanges,iDrive);
-01061             
-01062             _LIT(KRenameFile,"rename.file");
-01063             file.Rename(KRenameFile);
-01064                    
-01065             _LIT(KTxtFolderChanges,"\nnotify.file at %c drive at :\\private\\e80000fb\\filechange\\ location has been renamed to rename.file\n");
-01066             iConsole->Printf(KTxtFolderChanges,iDrive);
-01067             return;
-01068             }     
-01069         }
-01070     file.Close();  
-01071     }
-01072 
-01073 void CChangeNotifier::PressAnyKey()
-01074     {
-01075     iOptionContinue = ETrue;
-01076     _LIT(KPressAnyKey,"Press any key to continue");
-01077     iConsole->Printf(KPressAnyKey);
-01078     iConsole->Read(iStatus);
-01079     if(!IsActive())
-01080         {
-01081         SetActive();
-01082         }    
-01083     }
-01084 
-01085 void CChangeNotifier::DoCancel()
-01086     {
-01087     iNotify->CancelNotifications(iReqStatus);
-01088     iConsole->ReadCancel();
-01089     }
-01090 
-01091 
-01092 void CChangeNotifier::RequestCharacter()
-01093     {   
-01094     iOption = EFalse;
-01095     iOptionContinue = EFalse;
-01096     iDeleteFileContinue = EFalse;
-01097     _LIT(KMenuL1,"\nChoose an option:\n");
-01098     _LIT(KMenuL2,"1.Get notified when a file changes\n");
-01099     _LIT(KMenuL3,"2.Get notified when a folder changes\n");
-01100     _LIT(KMenuL4,"3.Get notified when the volume name changes\n");
-01101     _LIT(KMenuL5,"4.Multiple notifications\n");
-01102     
-01103     iConsole->Printf(KMenuL1);
-01104     iConsole->Printf(KMenuL2);
-01105     iConsole->Printf(KMenuL3);
-01106     iConsole->Printf(KMenuL4);
-01107     iConsole->Printf(KMenuL5);
-01108 
-01109     TChar choice = iConsole->Getch();
-01110     switch(choice)
-01111         {
-01112         case '1':
-01113             {
-01114             NotifyChangeToFile();
-01115             break;
-01116             }
-01117         case '2':
-01118             {
-01119             NotifyChangeToFolder();
-01120             break;
-01121             }
-01122         case '3':
-01123             {
-01124             VolumeNameChange();
-01125             break;
-01126             }
-01127         case '4':
-01128                    {
-01129                    MultipleNotifications();
-01130                    break;
-01131                    }
-01132         default:
-01133             {
-01134             iOption = ETrue;
-01135             _LIT(KPressAnyKey,"Press any key to Exit");
-01136             iConsole->Printf(KPressAnyKey);
-01137             iConsole->Read(iStatus);
-01138             if(!IsActive())
-01139                 {
-01140                 SetActive();
-01141                 } 
-01142             break;
-01143             }
-01144         }
-01145     }
-01146 
-01147 static void MainL()
-01148     {
-01149     CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
-01150     CleanupStack::PushL(scheduler);
-01151     CActiveScheduler::Install(scheduler);
-01152     CChangeNotifier* changeNotifier = CChangeNotifier::NewL();
-01153     CleanupStack::PushL(changeNotifier);
-01154     changeNotifier->RequestCharacter();
-01155     CActiveScheduler::Start();
-01156     
-01157     CleanupStack::PopAndDestroy(changeNotifier);
-01158     CleanupStack::PopAndDestroy(scheduler);
-01159     }
-01160 
-01161 extern TInt E32Main()
-01162     {
-01163     // Create cleanup stack
-01164     __UHEAP_MARK;
-01165     CTrapCleanup* cleanup = CTrapCleanup::New();
-01166     if(cleanup == NULL)
-01167         {
-01168         return KErrNoMemory;
-01169         }
-01170 
-01171     // Run application code inside a TRAP harness.
-01172     TRAPD(mainError, MainL());
-01173     if(mainError != KErrNone)
-01174         {
-01175         _LIT(KUserPanic,"Failed to complete");  
-01176         User::Panic(KUserPanic, mainError);
-01177         }
-01178     delete cleanup;
-01179     __UHEAP_MARKEND;
-01180     return KErrNone;
-01181     }
-

Generated on Thu Jan 21 10:32:56 2010 for TB10.1 Example Applications by  - -doxygen 1.5.3
- -