Support SMTP URLs
[zxing.git] / symbian / QQrDecoder / QCameraControllerWidget.cpp
1 #include "QCameraControllerWidget.h"\r
2 #include <QPainter>\r
3 \r
4 QCameraControllerWidget::QCameraControllerWidget(QWidget* parent) : QWidget(parent),\r
5 iCameraWrapper(NULL), iBackBuffer(NULL), iBackBufferDevice(NULL), iBackBufferContext(NULL)\r
6 {\r
7     timer = new QTimer(this);\r
8     connect(timer, SIGNAL(timeout()), this, SLOT(sendBackbufferToDecode()));\r
9     timer->start(500);\r
10 }\r
11 \r
12 QCameraControllerWidget::~QCameraControllerWidget()\r
13 {\r
14     if (iCameraWrapper)\r
15     {\r
16         iCameraWrapper->ReleaseAndPowerOff();\r
17     }\r
18 \r
19     delete iCameraWrapper;\r
20 \r
21     if(timer)\r
22     {\r
23         delete timer;\r
24         timer = NULL;\r
25     }\r
26 \r
27     ReleaseBackBuffer();\r
28 }\r
29 \r
30 void QCameraControllerWidget::CaptureImage()\r
31 {\r
32     if (iCameraWrapper && iCameraWrapper->State() == CCameraEngine::EEngineViewFinding)\r
33     {\r
34         emit logMessage("Capturing picture");\r
35         iCameraWrapper->StopViewFinder();\r
36         TRAPD(err,iCameraWrapper->CaptureL());\r
37         if (err)\r
38         {\r
39             emit logMessage("Camera capture error");                    \r
40         }\r
41     }\r
42 }\r
43 \r
44 void QCameraControllerWidget::paintEvent(QPaintEvent* event)\r
45 {\r
46     if(iBackBuffer)\r
47     {\r
48         QPainter paint(this);\r
49         paint.drawPixmap(0,0,QPixmap::fromSymbianCFbsBitmap(iBackBuffer));\r
50     }\r
51 }\r
52 \r
53 void QCameraControllerWidget::resizeEvent(QResizeEvent* event)\r
54 {\r
55     static int savedWidth = 0;\r
56     static int savedHeight = 0;\r
57     \r
58     if(!savedWidth || !savedHeight)\r
59     {\r
60         InitializeCamera();\r
61         savedWidth = geometry().width();\r
62         savedHeight = geometry().height();\r
63     }\r
64 }\r
65 \r
66 void QCameraControllerWidget::InitializeCamera()\r
67 {\r
68     // Create camera wrapper class here because\r
69     // whole camera wrapper and all handles have to reset\r
70     // while orientatio of the application changes.\r
71     if (iCameraWrapper)\r
72     {\r
73         // Power off camera if it is on\r
74         iCameraWrapper->StopViewFinder();\r
75         iCameraWrapper->ReleaseAndPowerOff();\r
76         delete iCameraWrapper; iCameraWrapper = NULL;\r
77     }\r
78     TInt camErr(KErrNotSupported);\r
79     if(CCameraEngine::CamerasAvailable() > 0)\r
80     {\r
81         TRAP(camErr, iCameraWrapper = CCameraEngine::NewL(0,0,this));\r
82     }\r
83 \r
84     // iViewFinderSize is picture size for viewfinder.\r
85     // iCaptureSize is picture size for capturing picture.\r
86     // We want fill whole screen\r
87     if (geometry().width() > geometry().height())\r
88     {\r
89         iViewFinderSize = TSize(geometry().width(),geometry().width());\r
90         iCaptureSize = TSize(geometry().width(),geometry().width()); // Captured picture size\r
91     }\r
92     else\r
93     {\r
94         iViewFinderSize = TSize(geometry().height(), geometry().height());\r
95         iCaptureSize = TSize(geometry().height(),geometry().height()); // Captured picture size\r
96     }\r
97 \r
98     // Create back buffer where recieved camera pictures are copied\r
99     ReleaseBackBuffer();\r
100     CreateBackBufferL();\r
101 \r
102     // Power on camera, start viewfinder when MceoCameraReady() received\r
103     if(camErr == KErrNone)\r
104     {\r
105         iCameraWrapper->ReserveAndPowerOn();    \r
106         emit logMessage("Camera power on");\r
107     }\r
108     else\r
109     {\r
110         emit logMessage("no camera found");\r
111     }\r
112 }\r
113 \r
114 void QCameraControllerWidget::CreateBackBufferL()\r
115 {\r
116     // create back buffer bitmap\r
117     iBackBuffer = q_check_ptr(new CFbsBitmap);\r
118 \r
119     try{\r
120         TSize size;\r
121         size.iHeight = this->geometry().height();\r
122         size.iWidth = this->geometry().width();\r
123         QT_TRAP_THROWING( iBackBuffer->Create(size,EColor64K));\r
124     }\r
125     catch(std::exception& e)\r
126     {\r
127 \r
128     }\r
129 \r
130     // create back buffer graphics context\r
131     iBackBufferDevice = CFbsBitmapDevice::NewL(iBackBuffer);\r
132     User::LeaveIfError(iBackBufferDevice->CreateContext(iBackBufferContext));\r
133     iBackBufferContext->SetPenStyle(CGraphicsContext::ESolidPen);\r
134 \r
135     iBackBufferContext->SetBrushColor(KRgbBlack);\r
136     iBackBufferContext->Clear();\r
137 }\r
138 \r
139 void QCameraControllerWidget::ReleaseBackBuffer()\r
140 {\r
141     if (iBackBufferContext)\r
142     {\r
143         delete iBackBufferContext;\r
144         iBackBufferContext = NULL;\r
145     }\r
146     if (iBackBufferDevice)\r
147     {\r
148         delete iBackBufferDevice;\r
149         iBackBufferDevice = NULL;\r
150     }\r
151     if (iBackBuffer)\r
152     {\r
153         delete iBackBuffer;\r
154         iBackBuffer = NULL;\r
155     }\r
156 }\r
157 \r
158 void QCameraControllerWidget::MceoCameraReady()\r
159 {\r
160     if (iCameraWrapper->State() == CCameraEngine::EEngineIdle)\r
161     {\r
162         // Prepare camera\r
163         TSize imageSize;\r
164         imageSize.iHeight = 480;\r
165         imageSize.iWidth = 640;\r
166 \r
167         CCamera::TFormat format = CCamera::EFormatFbsBitmapColor64K;\r
168 \r
169         TRAPD(err,iCameraWrapper->PrepareL(imageSize, format));\r
170         if (err)\r
171         {\r
172             emit logMessage("Camera prepare error");\r
173             return;\r
174         }\r
175 \r
176         // Start viewfinder. Viewfinder pictures starts coming into MceoViewFinderFrameReady();\r
177 \r
178         TSize finderSize;\r
179         finderSize.iHeight = this->geometry().height();\r
180         finderSize.iWidth = this->geometry().width();\r
181         TRAPD(err2,iCameraWrapper->StartViewFinderL(finderSize));\r
182         if (err2)\r
183         {\r
184             emit logMessage("Camera start viewfinder error");\r
185             return;\r
186         }\r
187 \r
188         emit logMessage("Camera viewfinder started");\r
189     }\r
190 }\r
191 \r
192 void QCameraControllerWidget::MceoFocusComplete()\r
193 {\r
194     // CameraEngine state is EEngineIdle\r
195     emit logMessage("Focused");\r
196 \r
197     // Capture picture after it has focused\r
198     iCameraWrapper->StopViewFinder();\r
199     TRAPD(err,iCameraWrapper->CaptureL());\r
200     if (err)\r
201     {\r
202         emit logMessage("Camera capture error");\r
203     }\r
204 }\r
205 \r
206 void QCameraControllerWidget::MceoCapturedDataReady( TDesC8* aData )\r
207 {\r
208 \r
209 }\r
210 \r
211 void QCameraControllerWidget::MceoCapturedBitmapReady( CFbsBitmap* aBitmap )\r
212 {\r
213     if (iBackBufferContext)\r
214     {\r
215         emit logMessage("Succesfull capture");\r
216 \r
217         QPixmap pix(QPixmap::fromSymbianCFbsBitmap(aBitmap));\r
218         emit imageCaptured(pix.toImage());\r
219 \r
220         TSize finderSize;\r
221         finderSize.iHeight = this->geometry().height();\r
222         finderSize.iWidth = this->geometry().width();\r
223         TRAPD(err2,iCameraWrapper->StartViewFinderL(finderSize));\r
224         if (err2)\r
225         {\r
226             emit logMessage("Camera start viewfinder error");\r
227             return;\r
228         }\r
229     }\r
230     if (iCameraWrapper)\r
231         iCameraWrapper->ReleaseImageBuffer();\r
232 }\r
233 \r
234 void QCameraControllerWidget::MceoViewFinderFrameReady( CFbsBitmap& aFrame )\r
235 {\r
236     if (iBackBufferContext)\r
237     {\r
238         TSize bmpSizeInPixels = aFrame.SizeInPixels();\r
239         TInt xDelta = 0;\r
240         TInt yDelta = 0;\r
241         TPoint pos( xDelta, yDelta );\r
242 \r
243         // Copy received viewfinder picture to back buffer\r
244         iBackBufferContext->BitBlt( pos, &aFrame, TRect( TPoint( 0, 0 ), bmpSizeInPixels ));\r
245 \r
246         // Update backbuffer into screen \r
247         update();\r
248     }\r
249     if (iCameraWrapper)\r
250         iCameraWrapper->ReleaseViewFinderBuffer();\r
251 }\r
252 \r
253 void QCameraControllerWidget::MceoHandleError( TCameraEngineError aErrorType, TInt aError )\r
254 {\r
255     // NOTE: CameraEngine state seems to go into CCameraEngine::EEngineIdle state\r
256 \r
257     if (aErrorType == EErrReserve)\r
258     {\r
259         return; //-18 comes on application startup, but everything works ok\r
260     }\r
261 \r
262     switch (aErrorType)\r
263     {\r
264     case EErrReserve:\r
265     {\r
266         emit logMessage("Camera reserved error");\r
267         break;\r
268     }\r
269     case EErrPowerOn:\r
270     {\r
271         emit logMessage("Camera power on error");\r
272         break;\r
273     }\r
274     case EErrViewFinderReady:\r
275     {\r
276         emit logMessage("Camera viewfinder error");\r
277         break;\r
278     }\r
279     case EErrImageReady:\r
280     {\r
281         emit logMessage("Camera image ready error");\r
282         break;\r
283     }\r
284     case EErrAutoFocusInit:\r
285     case EErrAutoFocusMode:\r
286     case EErrAutoFocusArea:\r
287     case EErrAutoFocusRange:\r
288     case EErrAutoFocusType:\r
289     case EErrOptimisedFocusComplete:\r
290     {\r
291         //emit logMessage("Try focusing again");\r
292         break;\r
293     }\r
294     default:\r
295     {\r
296         emit logMessage("Unknown error");\r
297         break;\r
298     }\r
299     };\r
300 \r
301     // Try handle error\r
302     //CancelCapturedPicture(EFalse);\r
303     //    iAppUi->UseOptionsExitCbaL();\r
304 }\r
305 \r
306 void QCameraControllerWidget::MceoHandleOtherEvent( const TECAMEvent& /*aEvent*/ )\r
307 {\r
308 }\r
309 \r
310 //Timer slot\r
311 void QCameraControllerWidget::sendBackbufferToDecode()\r
312 {\r
313     if(!iBackBuffer)\r
314         return;\r
315 \r
316     QPixmap pix(QPixmap::fromSymbianCFbsBitmap(iBackBuffer));\r
317     emit imageCaptured(pix.toImage());\r
318 \r
319     if(timer)\r
320         timer->start(500);\r
321 }\r
322 \r