Create string tightly when retrive string from cbhm callback event
[framework/web/webkit-efl.git] / Source / WebKit2 / UIProcess / API / efl / VibrationProvider.cpp
1 /*
2  * Copyright (C) 2012 Intel Corporation. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "VibrationProvider.h"
28
29 #if ENABLE(VIBRATION)
30
31 #include "WKAPICast.h"
32 #include "WKContext.h"
33 #include "WKVibration.h"
34 #include <Evas.h>
35
36 using namespace WebCore;
37
38 /**
39  * \struct  Ewk_Vibration_Client
40  * @brief   Contains the vibration client callbacks.
41  */
42 struct Ewk_Vibration_Client {
43     Ewk_Vibration_Client_Vibrate_Cb vibrate;
44     Ewk_Vibration_Client_Vibration_Cancel_Cb cancelVibration;
45     void* userData;
46
47     Ewk_Vibration_Client(Ewk_Vibration_Client_Vibrate_Cb vibrate, Ewk_Vibration_Client_Vibration_Cancel_Cb cancelVibration, void* userData)
48         : vibrate(vibrate)
49         , cancelVibration(cancelVibration)
50         , userData(userData)
51     { }
52 };
53
54 static inline VibrationProvider* toVibrationProvider(const void* clientInfo)
55 {
56     return static_cast<VibrationProvider*>(const_cast<void*>(clientInfo));
57 }
58
59 static void vibrateCallback(WKVibrationRef vibrationRef, uint64_t vibrationTime, const void* clientInfo)
60 {
61     toVibrationProvider(clientInfo)->vibrate(vibrationTime);
62 }
63
64 static void cancelVibrationCallback(WKVibrationRef vibrationRef, const void* clientInfo)
65 {
66     toVibrationProvider(clientInfo)->cancelVibration();
67 }
68
69 PassRefPtr<VibrationProvider> VibrationProvider::create(WKContextRef wkContext)
70 {
71     return adoptRef(new VibrationProvider(wkContext));
72 }
73
74 VibrationProvider::VibrationProvider(WKContextRef wkContext)
75     : m_wkContext(wkContext)
76 {
77     ASSERT(m_wkContext.get());
78
79     WKVibrationRef wkVibration = WKContextGetVibration(m_wkContext.get());
80     ASSERT(wkVibration);
81
82     WKVibrationProvider wkVibrationProvider = {
83         kWKVibrationProviderCurrentVersion,
84         this, // clientInfo
85         vibrateCallback,
86         cancelVibrationCallback
87     };
88     WKVibrationSetProvider(wkVibration, &wkVibrationProvider);
89 }
90
91 VibrationProvider::~VibrationProvider()
92 {
93     WKVibrationRef wkVibration = WKContextGetVibration(m_wkContext.get());
94     ASSERT(wkVibration);
95
96     WKVibrationSetProvider(wkVibration, 0);
97 }
98
99 void VibrationProvider::vibrate(uint64_t vibrationTime)
100 {
101     if (m_vibrationClient && m_vibrationClient->vibrate)
102         m_vibrationClient->vibrate(vibrationTime, m_vibrationClient->userData);
103 }
104
105 void VibrationProvider::cancelVibration()
106 {
107     if (m_vibrationClient && m_vibrationClient->cancelVibration)
108         m_vibrationClient->cancelVibration(m_vibrationClient->userData);
109 }
110
111 void VibrationProvider::setVibrationClientCallbacks(Ewk_Vibration_Client_Vibrate_Cb vibrate, Ewk_Vibration_Client_Vibration_Cancel_Cb cancelVibration, void* data)
112 {
113     m_vibrationClient = adoptPtr(new Ewk_Vibration_Client(vibrate, cancelVibration, data));
114 }
115
116 #endif // ENABLE(VIBRATION)