summaryrefslogtreecommitdiff
path: root/Runtime/Utilities/UserAuthorizationManager.cpp
blob: 5513cb6b23e0963abf776f344169392ea4a3c65e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include "UnityPrefix.h"
#include "UserAuthorizationManager.h"
#include "Runtime/Misc/GameObjectUtility.h"

#if WEBPLUG
#include "Runtime/Misc/PlayerSettings.h"
#include "Runtime/Utilities/GlobalPreferences.h"
#include "PlatformDependent/CommonWebPlugin/Verification.h"
#endif

#if UNITY_EDITOR
#include "Editor/Src/EditorUserBuildSettings.h"
#include "Editor/Src/BuildPipeline/BuildTargetPlatformSpecific.h"
#endif

UserAuthorizationManager gUserAuthorizationManager;

UserAuthorizationManager& GetUserAuthorizationManager()
{
	return gUserAuthorizationManager;
}

UserAuthorizationManager::UserAuthorizationManager()
{
	m_AuthorizationOperation = NULL;
	Reset ();
}

#if WEBPLUG && !UNITY_PEPPER
std::string GetUserAuthorizationModeKey ()
{
	static const char *kUserAuthorizationModeKey = "UserAuthorizationMode";
	std::string domain = GetStrippedPlayerDomain ();
	std::string hash = GenerateHash ((unsigned char*)&domain[0], domain.size());
	return kUserAuthorizationModeKey + hash;
}
#endif

void UserAuthorizationManager::Reset()
{
#if WEBPLUG && !UNITY_PEPPER
	m_AuthorizationMode = kNone;
	if (GetPlayerSettingsPtr())
	{
		std::string auth = GetGlobalPreference(GetUserAuthorizationModeKey().c_str());
		sscanf(auth.c_str(), "%x", &m_AuthorizationMode);
	}
#else
#if UNITY_EDITOR
	if (GetEditorUserBuildSettingsPtr() != NULL && GetBuildTargetGroup(GetEditorUserBuildSettings().GetActiveBuildTarget()) == kPlatformWebPlayer)
		m_AuthorizationMode = kNone;
	else
#endif
	// Allow Webcam and Microphone on all others targets than webplayer.
	m_AuthorizationMode = kWebCam | kMicrophone;
#endif
	if (m_AuthorizationOperation)
	{
		m_AuthorizationOperation->Release();
		m_AuthorizationOperation = NULL;
	}
	m_AuthorizationRequest = kNone;
}

AsyncOperation *UserAuthorizationManager::RequestUserAuthorization(int mode)
{
	if (m_AuthorizationOperation != NULL)
	{
		ErrorString ("A RequestUserAuthorization is already pending.");
	}	
	else if (!HasUserAuthorization (mode))
	{
		m_AuthorizationRequest = mode;
		m_AuthorizationOperation = new UserAuthorizationManagerOperation ();
		m_AuthorizationOperation->Retain();
		return m_AuthorizationOperation;
	}

	return new UserAuthorizationManagerErrorOperation ();
}	

void UserAuthorizationManager::ReplyToUserAuthorizationRequest(bool reply, bool remember)
{
	if (reply)
	{
		m_AuthorizationMode |= m_AuthorizationRequest;
#if WEBPLUG && !UNITY_PEPPER
		if (remember)
			SetGlobalPreference(GetUserAuthorizationModeKey().c_str(), Format("%x", m_AuthorizationMode).c_str());
#endif
	}
	m_AuthorizationRequest = kNone;
	if (m_AuthorizationOperation)
	{
		m_AuthorizationOperation->InvokeCoroutine();
		m_AuthorizationOperation->Release();
		m_AuthorizationOperation = NULL;
	}
}	

MonoBehaviour *UserAuthorizationManager::GetAuthorizationDialog ()
{
	if (m_AuthorizationRequest != kNone)
	{
		if (!m_AuthorizationDialog.IsValid())	 	
		{
			m_AuthorizationDialog = &CreateGameObject ("", "Transform", "UserAuthorizationDialog", NULL);
			m_AuthorizationDialog->SetHideFlags (Object::kHideInHierarchy);
		}
		return m_AuthorizationDialog->QueryComponent (MonoBehaviour);
	}
	else
	{
		if (m_AuthorizationDialog.IsValid ())
			DestroyObjectHighLevel (m_AuthorizationDialog, true);
		return NULL;
	}
}