os/mm/mmplugins/cameraplugins/source/mmcameraclientplugin/mmcameraserver/src/mmcameraserversession.cpp
First public contribution.
1 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
14 // mmcamerasession.cpp
23 #include "mmcameraserversession.h"
24 #include "mmcameraservercontroller.h"
27 CMMCameraServerSession::CMMCameraServerSession()
29 iHandle(KECamHandleNotKnown),
30 iPriority(KECamNoPriority),
32 iCollaborativeClient(EFalse),
38 void CMMCameraServerSession::CreateL()
40 iCameraServer = static_cast<CMMCameraServer*>(const_cast<CServer2*>(CSession2::Server()));
41 // Get server policymanager
42 iPolicyManager = Server()->PolicyManager();
44 //load camera control etc in OpenCamera...
45 Server()->AddSession();
48 CMMCameraServerSession::~CMMCameraServerSession()
50 // CameraController()->Reset();
51 Server()->DropSession();
53 //deque the session queued in controller
54 iCamSessionLink.Deque(); //safe to deque if it does not exists in the queue.
55 iCamSessionLink.iNext = NULL;
58 void CMMCameraServerSession::Disconnect(const RMessage2 &aMessage)
60 if(!iOverthrowMessage.IsNull())
62 iOverthrowMessage.Complete(KErrCancel);
64 CSession2::Disconnect(aMessage);
67 void CMMCameraServerSession::ServiceL(const RMessage2& aMessage)
70 // Do policy manager checks
71 iPolicyManager->ServiceHandlerL(aMessage);
73 switch (aMessage.Function())
75 case ECamQueryCamerasAvailable:
77 CamerasAvailable(aMessage);
87 case ECamCameraAccessControl:
89 switch(aMessage.Int0())
97 case ECameraReservedNotification:
103 case ECameraCancelReservedNotification:
105 CancelReserve(aMessage);
109 case ECameraOverthrowNotification:
111 if(iOverthrowMessage.IsNull())
113 iOverthrowMessage = aMessage;
117 aMessage.Complete(KErrServerBusy);
122 case ECameraCancelOverthrowNotification:
124 if(!iOverthrowMessage.IsNull())
126 iOverthrowMessage.Complete(KErrCancel);
128 CameraController()->Reset(); //Stops VF, VC. Cancels ImageCapture if issued using this session.
129 aMessage.Complete(KErrNone);
134 aMessage.Complete(KErrArgument);
138 case ECamPowerCamera:
140 switch(aMessage.Int0())
142 case ECameraPowerOnNotification:
147 case ECameraPowerOff:
150 aMessage.Complete(KErrNone);
153 case ECameraCancelPowerOnNotification:
156 aMessage.Complete(KErrNone);
163 case ECamPrepareDirectViewFinder:
165 PrepareDirectViewFinder(aMessage);
169 case ECamStartDirectViewFinder:
171 StartDirectViewFinder(aMessage);
175 case ECamStopDirectViewFinder:
177 StopDirectViewFinder(aMessage);
181 case ECamPauseDirectViewFinder:
183 PauseDirectViewFinder(aMessage);
187 case ECamResumeDirectViewFinder:
189 ResumeDirectViewFinder(aMessage);
193 case ECamDirectViewFinderState:
195 DirectViewFinderState(aMessage);
199 case ECamSetDirectViewFinderMirror:
201 SetDirectViewFinderMirror(aMessage);
205 case ECamGetDirectViewFinderMirror:
207 GetDirectViewFinderMirror(aMessage);
211 case ECamDirectViewFinderProperties:
213 DirectViewFinderProperties(aMessage);
216 case ECamSetParameter:
218 SetCameraParameter(aMessage);
222 case ECamGetParameter:
224 GetCameraParameter(aMessage);
228 case ECamCameraHandle:
230 CameraHandle(aMessage);
235 Server()->PanicClient(aMessage, EPanicNotSupported);
241 * Queries controller to find out how many cameras are available to clients.
243 void CMMCameraServerSession::CamerasAvailable(const RMessage2& aMessage)
245 TCamerasAvailable info;
247 CMMCameraServerControllerQuery* query = NULL;
248 TRAPD(error, Server()->GetCameraControllerQueryL(query));
249 if (error == KErrNone)
251 info.iCameraCount = query->GetCamerasAvailable();
254 TCamerasAvailablePckg pckg(info);
255 error = aMessage.Write(TInt(0), pckg);
258 aMessage.Complete(error);
262 * Stores client information and retrieves camera controller for required camera index.
264 * Called when client connects to the server for the first time.
266 void CMMCameraServerSession::OpenCamera(const RMessage2& aMessage)
268 TOpenCamera parameters;
269 TOpenCameraPckg parametersBuf(parameters);
271 TInt error = aMessage.Read(TInt(0),parametersBuf);
272 if (error != KErrNone)
274 aMessage.Complete(error);
277 parameters = parametersBuf();
279 iCameraIndex = parameters.iCameraIndex; // Store the required member variables
280 iPriority = parameters.iPriority;
281 iMMCapability = parameters.iMMCapability;
282 iHandle = parameters.iHandle;
283 iCollaborativeClient = parameters.iCollaborativeClient;
285 TRAP(error, Server()->GetCameraControllerL(iCameraIndex, iCameraController));
287 aMessage.Complete(error);
291 * Reserves the camera.
293 * Delegates the responsibility to the policy manager
295 void CMMCameraServerSession::Release(const RMessage2& aMessage)
299 aMessage.Complete(KErrAlreadyExists);
303 CameraController()->Reset(); //Stops VF, VC. Cancels ImageCapture if issued using this session.
305 iPolicyManager->ReleaseClient(this);
310 if(!iOverthrowMessage.IsNull())
312 iOverthrowMessage.Complete(KErrCancel);
315 aMessage.Complete(KErrNone);
319 void CMMCameraServerSession::CompleteOverthrow ()
321 if(!iOverthrowMessage.IsNull())
323 // Complete means sucess
324 iOverthrowMessage.Complete(KErrNone);
331 * Releases the camera.
333 * Delegates the responsibility to the policy manager
335 void CMMCameraServerSession::Reserve(const RMessage2& aMessage)
339 aMessage.Complete(KErrInUse);
343 iReserved = iPolicyManager->ReserveClient(this);
347 aMessage.Complete(KErrAccessDenied);
351 aMessage.Complete(KErrNone);
356 * Cancels on ongoing Reserve() operation.
358 void CMMCameraServerSession::CancelReserve(const RMessage2& aMessage)
364 * Powers on the device.
366 * Simply returns with KErrNone or KErrNotReady since device is not powered on until VF is activated.
368 void CMMCameraServerSession::PowerOn(const RMessage2& aMessage)
372 aMessage.Complete(KErrNotReady);
376 aMessage.Complete(KErrInUse);
381 aMessage.Complete(KErrNone);
386 * Powers off the device.
388 * Simply stops any viewfinder activity.
390 void CMMCameraServerSession::PowerOff()
392 CameraController()->Reset();
397 void CMMCameraServerSession::CancelPowerOn()
403 * Prepares the view finder.
405 * First step before viewfinder is started.
407 void CMMCameraServerSession::PrepareDirectViewFinder(const RMessage2& aMessage)
409 TDirectViewFinderInfo viewFinderInfo;
410 TDirectViewFinderInfoPckg viewFinderInfoPckg(viewFinderInfo);
412 TInt error = aMessage.Read(TInt(0), viewFinderInfoPckg);
413 if(error == KErrNone)
415 viewFinderInfo = viewFinderInfoPckg();
416 TRAP(error, CameraController()->PrepareDirectViewFinderL(viewFinderInfo));
417 if(error == KErrNone)
419 TDirectViewFinderInfoPckg pckg(viewFinderInfo);
420 error = aMessage.Write(TInt(0), pckg);
424 aMessage.Complete(error);
428 * Starts the viewfinder
430 void CMMCameraServerSession::StartDirectViewFinder(const RMessage2& aMessage)
432 TInt error = CameraController()->StartDirectViewFinder();
433 aMessage.Complete(error);
437 * Stops the viewfinder.
439 * Returns KErrNone even if stop is called when the viewfinder is not active, as client API must fail silently if error occurs.
441 void CMMCameraServerSession::StopDirectViewFinder(const RMessage2& aMessage)
443 if (CameraController()->GetDirectViewFinderState() == CCamera::CCameraV2DirectViewFinder::EViewFinderActive)
445 CameraController()->StopDirectViewFinder();
448 aMessage.Complete(KErrNone);
452 * Pauses the viewfinder.
454 * Returns KErrNone even if pause is called when the viewfinder is not active, as client API must fail silently if error occurs.
456 void CMMCameraServerSession::PauseDirectViewFinder(const RMessage2& aMessage)
458 if (CameraController()->GetDirectViewFinderState() == CCamera::CCameraV2DirectViewFinder::EViewFinderActive)
460 CameraController()->PauseDirectViewFinder();
463 aMessage.Complete(KErrNone);
467 * Resumes the viewfinder if previously paused.
469 * Returns KErrNone even if resume is called when the viewfinder is not paused, as client API must fail silently if error occurs.
471 void CMMCameraServerSession::ResumeDirectViewFinder(const RMessage2& aMessage)
473 if (CameraController()->GetDirectViewFinderState() == CCamera::CCameraV2DirectViewFinder::EViewFinderPause)
475 CameraController()->ResumeDirectViewFinder();
478 aMessage.Complete(KErrNone);
482 * Retrieves the state of the viewfinder
484 void CMMCameraServerSession::DirectViewFinderState(const RMessage2& aMessage)
486 TDirectViewFinderState state;
488 state.iState = CameraController()->GetDirectViewFinderState();
490 TDirectViewFinderStatePckg pckg(state);
491 TInt error = aMessage.Write(TInt(0), pckg);
493 aMessage.Complete(error);
497 * Sets viewfinder mirror mode on or off.
499 void CMMCameraServerSession::SetDirectViewFinderMirror(const RMessage2& aMessage)
501 TViewFinderMirror viewFinderMirror;
502 TViewFinderMirrorPckg pckg(viewFinderMirror);
504 TInt error = aMessage.Read(TInt(0), pckg);
505 if (error == KErrNone)
507 viewFinderMirror = pckg();
508 error = CameraController()->SetDirectViewFinderMirror(viewFinderMirror.iMirror);
511 aMessage.Complete(error);
515 * Retrieves whether viewfinder mirror mode is activated or not.
517 void CMMCameraServerSession::GetDirectViewFinderMirror(const RMessage2& aMessage)
519 TViewFinderMirror viewFinderMirror;
521 TInt error = CameraController()->GetDirectViewFinderMirror(viewFinderMirror.iMirror);
522 if (error == KErrNone)
524 TViewFinderMirrorPckg pckg(viewFinderMirror);
525 error = aMessage.Write(TInt(0), pckg);
528 aMessage.Complete(error);
532 * Retrieves the viewfinder properties
534 void CMMCameraServerSession::DirectViewFinderProperties(const RMessage2& aMessage)
536 TDirectViewFinderInfo info;
538 TInt error = CameraController()->DirectViewFinderProperties(info.iScreenNum, info.iScreenRect, info.iClipRect);
539 if (error == KErrNone)
541 TDirectViewFinderInfoPckg pckg(info);
542 error = aMessage.Write(TInt(0), pckg);
545 aMessage.Complete(error);
549 * Sets various camera parameters depending on what the client wishes to set.
551 void CMMCameraServerSession::SetCameraParameter(const RMessage2& aMessage)
553 TInt error = KErrNone;
555 switch(aMessage.Int0())
559 TInt zoom = aMessage.Int1();
560 error = CameraController()->SetZoom(zoom);
561 aMessage.Complete(error);
565 case EDigitalZoomFactor:
567 TInt digitalZoom = aMessage.Int1();
568 error = CameraController()->SetDigitalZoom(digitalZoom);
569 aMessage.Complete(error);
575 TInt contrast = aMessage.Int1();
576 error = CameraController()->SetContrast(contrast);
577 aMessage.Complete(error);
583 TInt brightness = aMessage.Int1();
584 error = CameraController()->SetBrightness(brightness);
585 aMessage.Complete(error);
592 TCameraFlashPckg pckg(flash);
594 error = aMessage.Read(TInt(1), pckg);
595 if (error == KErrNone)
598 error = CameraController()->SetFlash(flash.iFlash);
600 aMessage.Complete(error);
606 TCameraExposure exposure;
607 TCameraExposurePckg pckg(exposure);
609 error = aMessage.Read(TInt(1), pckg);
610 if (error == KErrNone)
613 error = CameraController()->SetExposure(exposure.iExposure);
615 aMessage.Complete(error);
621 TCameraWhiteBalance whiteBalance;
622 TCameraWhiteBalancePckg pckg(whiteBalance);
624 error = aMessage.Read(TInt(1), pckg);
625 if (error == KErrNone)
627 whiteBalance = pckg();
628 error = CameraController()->SetWhiteBalance(whiteBalance.iWhiteBalance);
630 aMessage.Complete(error);
636 Server()->PanicClient(aMessage, EPanicNotSupported);
643 * Gets various camera parameters depending on what information the client wishes to retrieve.
645 void CMMCameraServerSession::GetCameraParameter(const RMessage2& aMessage)
647 TInt error = KErrNone;
649 switch(aMessage.Int0())
654 error = CameraController()->GetZoom(zoom.iZoom);
655 if (error == KErrNone)
657 TCameraZoomPckg pckg(zoom);
658 error = aMessage.Write(TInt(1), pckg);
663 case EDigitalZoomFactor:
665 TCameraDigitalZoom digitalZoom;
666 error = CameraController()->GetDigitalZoom(digitalZoom.iDigitalZoom);
667 if (error == KErrNone)
669 TCameraDigitalZoomPckg pckg(digitalZoom);
670 error = aMessage.Write(TInt(1), pckg);
677 TCameraContrast contrast;
678 error = CameraController()->GetContrast(contrast.iContrast);
679 if (error == KErrNone)
681 TCameraContrastPckg pckg(contrast);
682 error = aMessage.Write(TInt(1), pckg);
689 TCameraBrightness brightness;
690 error = CameraController()->GetBrightness(brightness.iBrightness);
691 if (error == KErrNone)
693 TCameraBrightnessPckg pckg(brightness);
694 error = aMessage.Write(TInt(1), pckg);
702 error = CameraController()->GetFlash(flash.iFlash);
703 if (error == KErrNone)
705 TCameraFlashPckg pckg(flash);
706 error = aMessage.Write(TInt(1), pckg);
713 TCameraExposure exposure;
714 error = CameraController()->GetExposure(exposure.iExposure);
715 if (error == KErrNone)
717 TCameraExposurePckg pckg(exposure);
718 error = aMessage.Write(TInt(1), pckg);
725 TCameraWhiteBalance whiteBalance;
726 error = CameraController()->GetWhiteBalance(whiteBalance.iWhiteBalance);
727 if (error == KErrNone)
729 TCameraWhiteBalancePckg pckg(whiteBalance);
730 error = aMessage.Write(TInt(1), pckg);
737 Server()->PanicClient(aMessage, EPanicNotSupported);
742 aMessage.Complete(error);
746 * Retrives the camera handle
748 void CMMCameraServerSession::CameraHandle(const RMessage2& aMessage)
750 TCameraHandle cameraHandle;
752 cameraHandle.iHandle = CameraController()->CameraHandle();
753 TCameraHandlePckg pckg(cameraHandle);
755 aMessage.Write(TInt(0), pckg);
756 aMessage.Complete(KErrNone);
759 void CMMCameraServerSession::SetHandle (TInt aHandle)
764 void CMMCameraServerSession::SetPriority (TInt aPriority)
766 iPriority = aPriority;
769 void CMMCameraServerSession::SetReserved (TBool aReserved)
771 iReserved = aReserved;
774 CMMCameraServer* CMMCameraServerSession::Server()
776 return iCameraServer;
779 CMMCameraServerController* CMMCameraServerSession::CameraController()
781 return iCameraController;