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 @@ - -
-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 } -