IAP.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/wait.h>
  5. #include <sys/stat.h>
  6. #include <fcntl.h>
  7. #include <jni.h>
  8. #include <android/log.h>
  9. #include "IAP.h"
  10. #include "AndroidApp.h"
  11. //void (*)(EIAPValidationResult, int)
  12. fn_IAP_Fun fn_IAP_Fun_5CFFDC = nullptr;
  13. JNIEnv *JEIEnv_5CFFE0 = nullptr;
  14. idp_product_info *iap_product_5CFFE4 = nullptr;
  15. int dword_5CFFE8 = 0;
  16. int max_products_5CFFEC = 0;
  17. jclass jclass_FTTIAP = nullptr;
  18. jmethodID FTTIAP_SetPublicKeyAndSkuCount_5CFFF0 = nullptr;
  19. jmethodID FTTIAP_AddSku_5CFFF4 = nullptr;
  20. jmethodID FTTIAP_QueryInventoryAsync_5CFFF8 = nullptr;
  21. jmethodID FTTIAP_GetStatusString_5D0000 = nullptr;
  22. jmethodID FTTIAP_SetStatusString_5CFFFC = nullptr;
  23. jmethodID FTTIAP_ResetStatus_5D0004 = nullptr;
  24. jmethodID FTTIAP_HasPurchased_5D0008 = nullptr;
  25. jmethodID FTTIAP_Consume_5D000C = nullptr;
  26. jmethodID FTTIAP_Buy_5D0010 = nullptr;
  27. jmethodID FTTIAP_Init_5D0014 = nullptr;
  28. jmethodID FTTIAP_GetPrice_5D0018 = nullptr;
  29. jmethodID FTTIAP_SkuEnabled_5D001C = nullptr;
  30. jmethodID FTTIAP_AllPurchasesDisabled_5D0024 = nullptr;
  31. jmethodID FTTIAP_GetIAPStatusCount_5D0028 = nullptr;
  32. jmethodID FTTIAP_GetUserData_5D0020 = nullptr;
  33. const char *EAIAP_Stat_329BF0[] = {
  34. "EAIAP_NONE",
  35. "EAIAP_PRODUCTREQUEST",
  36. "EAIAP_PRODUCTREQUEST_FAILED",
  37. "EAIAP_PRODUCTREQUEST_SUCCESS",
  38. "EAIAP_PURCHASE",
  39. "EAIAP_PURCHASE_SUCCESS",
  40. "EAIAP_PURCHASE_FAILED",
  41. "EAIAP_CONSUME",
  42. "EAIAP_CONSUME_FAILED",
  43. "EAIAP_CONSUME_SUCCESS"};
  44. //---------------------------------------------------------------------------------------------------------------------------------------------
  45. //002740F8
  46. int IAP_BuyProduct(EIAPValidationResult eis, fn_IAP_Fun fn, bool b) {
  47. int dret = 0;
  48. EIAPValidationResult v7 = EIAPValidationResult_0;
  49. IAP_SetStatus(EAIAP_PURCHASE);
  50. if (IAP_GetProductPurchased(eis)) {
  51. if (b) {
  52. IAP_SetStatus(EAIAP_PURCHASE_SUCCESS);
  53. v7 = (EIAPValidationResult)6;
  54. } else {
  55. IAP_SetStatus(EAIAP_PURCHASE_FAILED);
  56. dret = 0;
  57. v7 = (EIAPValidationResult)7;
  58. }
  59. fn(v7, 0);
  60. } else if (IAP_PurchaseProduct(eis)) {
  61. dret = 1;
  62. fn_IAP_Fun_5CFFDC = fn;
  63. } else {
  64. dret = 0;
  65. }
  66. return dret;
  67. }
  68. //---------------------------------------------------------------------------------------------------------------------------------------------
  69. //00274218
  70. int IAP_CacheProductLocalPrices() {
  71. int dr4 = 0;
  72. while (dr4 < dword_5CFFE8) {
  73. //loc_274222
  74. IAP_StoreProductLocalisedPrice(dr4);
  75. dr4++;
  76. }
  77. return dr4;
  78. }
  79. //---------------------------------------------------------------------------------------------------------------------------------------------
  80. //002741A8
  81. bool IAP_CheckAndConsume(char *a1) {
  82. JNIEnv *env = AndroidApp_GetJNI();
  83. jclass cFTTIAP = AndroidApp_FindFTTJavaClass("FTTIAP");
  84. jstring s = env->NewStringUTF(a1);
  85. jmethodID jmid = env->GetStaticMethodID(cFTTIAP, "CheckPurchaseAndConsume", "(Ljava/lang/String;)Z");
  86. jboolean b = env->CallStaticBooleanMethod(cFTTIAP, jmid, s);
  87. env->DeleteLocalRef(s);
  88. env->DeleteLocalRef(cFTTIAP);
  89. return b != false;
  90. }
  91. //---------------------------------------------------------------------------------------------------------------------------------------------
  92. //00274088
  93. const char *IAP_GetIncompletePurchase() {
  94. const char *dret = nullptr;
  95. jclass cFTTIAP = AndroidApp_FindFTTJavaClass("FTTIAP");
  96. jmethodID jmid = JEIEnv_5CFFE0->GetStaticMethodID(cFTTIAP, "GetIncompletePurchase", "()Ljava/lang/String;");
  97. jobject obj = JEIEnv_5CFFE0->CallStaticObjectMethod(cFTTIAP, jmid);
  98. if (obj != nullptr) {
  99. dret = JEIEnv_5CFFE0->GetStringUTFChars((jstring)obj, nullptr);
  100. } else {
  101. dret = nullptr;
  102. }
  103. JEIEnv_5CFFE0->DeleteLocalRef(obj);
  104. JEIEnv_5CFFE0->DeleteLocalRef(cFTTIAP);
  105. return dret;
  106. }
  107. //---------------------------------------------------------------------------------------------------------------------------------------------
  108. //00273F70
  109. int IAP_GetMaxProducts() {
  110. return max_products_5CFFEC;
  111. }
  112. //---------------------------------------------------------------------------------------------------------------------------------------------
  113. //00273F64
  114. int IAP_GetProductCount() {
  115. return dword_5CFFE8;
  116. }
  117. //---------------------------------------------------------------------------------------------------------------------------------------------
  118. //00273F34
  119. int IAP_GetProductIndex(char *s) {
  120. int dr4 = 0;
  121. idp_product_info *pInfo = &iap_product_5CFFE4[0];
  122. while (dr4 < dword_5CFFE8) {
  123. //loc_273F44
  124. if (strcmp(pInfo->name_0, s) == 0)
  125. return dr4;
  126. pInfo++;
  127. dr4++;
  128. }
  129. return -1;
  130. }
  131. //---------------------------------------------------------------------------------------------------------------------------------------------
  132. //00273F20
  133. idp_product_info *IAP_GetProductInfo(int index) {
  134. return &iap_product_5CFFE4[index];
  135. }
  136. //---------------------------------------------------------------------------------------------------------------------------------------------
  137. //00274034
  138. bool IAP_GetProductPurchased(char *a1) {
  139. jstring s = JEIEnv_5CFFE0->NewStringUTF(a1);
  140. jclass cFTTIAP = AndroidApp_FindFTTJavaClass("FTTIAP");
  141. jboolean b = JEIEnv_5CFFE0->CallStaticBooleanMethod(cFTTIAP, FTTIAP_HasPurchased_5D0008, s);
  142. JEIEnv_5CFFE0->DeleteLocalRef(s);
  143. JEIEnv_5CFFE0->DeleteLocalRef(cFTTIAP);
  144. return b != 0;
  145. }
  146. //---------------------------------------------------------------------------------------------------------------------------------------------
  147. //00273C00
  148. bool IAP_GetProductPurchased(int a1) {
  149. return IAP_GetProductPurchased(iap_product_5CFFE4[a1].name_0);
  150. }
  151. //---------------------------------------------------------------------------------------------------------------------------------------------
  152. //00273C68
  153. int IAP_GetStatus() {
  154. unsigned int v0 = 0;
  155. const char *v1 = (const char *)IAP_GetStatusString();
  156. while (v0 <= sizeof(EAIAP_Stat_329BF0)) {
  157. if (!strcmp(v1, EAIAP_Stat_329BF0[v0]))
  158. return v0;
  159. ++v0;
  160. }
  161. return 0;
  162. }
  163. //---------------------------------------------------------------------------------------------------------------------------------------------
  164. //00273C18
  165. const char *IAP_GetStatusString() {
  166. jclass cFTTIAP = AndroidApp_FindFTTJavaClass("FTTIAP");
  167. jobject obj = JEIEnv_5CFFE0->CallStaticObjectMethod(cFTTIAP, FTTIAP_GetStatusString_5D0000);
  168. const char *p = JEIEnv_5CFFE0->GetStringUTFChars((jstring)obj, nullptr);
  169. JEIEnv_5CFFE0->DeleteLocalRef(obj);
  170. JEIEnv_5CFFE0->DeleteLocalRef(cFTTIAP);
  171. return p;
  172. }
  173. //---------------------------------------------------------------------------------------------------------------------------------------------
  174. //00273CE0
  175. void IAP_Init(char const *pkey, int count) {
  176. return;
  177. JEIEnv_5CFFE0 = AndroidApp_GetJNI();
  178. jclass_FTTIAP = AndroidApp_FindFTTJavaClass("FTTIAP");
  179. FTTIAP_SetPublicKeyAndSkuCount_5CFFF0 = JEIEnv_5CFFE0->GetStaticMethodID(jclass_FTTIAP, "SetPublicKeyAndSkuCount", "(Ljava/lang/String;I)V");
  180. FTTIAP_AddSku_5CFFF4 = JEIEnv_5CFFE0->GetStaticMethodID(jclass_FTTIAP, "AddSku", "(Ljava/lang/String;)V");
  181. FTTIAP_QueryInventoryAsync_5CFFF8 = JEIEnv_5CFFE0->GetStaticMethodID(jclass_FTTIAP, "QueryInventoryAsync", "()V");
  182. FTTIAP_GetStatusString_5D0000 = JEIEnv_5CFFE0->GetStaticMethodID(jclass_FTTIAP, "GetStatusString", "()Ljava/lang/String;");
  183. FTTIAP_SetStatusString_5CFFFC = JEIEnv_5CFFE0->GetStaticMethodID(jclass_FTTIAP, "SetStatusString", "(Ljava/lang/String;)V");
  184. FTTIAP_ResetStatus_5D0004 = JEIEnv_5CFFE0->GetStaticMethodID(jclass_FTTIAP, "ResetStatus", "()V");
  185. FTTIAP_HasPurchased_5D0008 = JEIEnv_5CFFE0->GetStaticMethodID(jclass_FTTIAP, "HasPurchased", "(Ljava/lang/String;)Z");
  186. FTTIAP_Consume_5D000C = JEIEnv_5CFFE0->GetStaticMethodID(jclass_FTTIAP, "Consume", "(Ljava/lang/String;)V");
  187. FTTIAP_Buy_5D0010 = JEIEnv_5CFFE0->GetStaticMethodID(jclass_FTTIAP, "Buy", "(Ljava/lang/String;)V");
  188. FTTIAP_Init_5D0014 = JEIEnv_5CFFE0->GetStaticMethodID(jclass_FTTIAP, "Init", "()V");
  189. FTTIAP_GetPrice_5D0018 = JEIEnv_5CFFE0->GetStaticMethodID(jclass_FTTIAP, "GetPrice", "(Ljava/lang/String;)Ljava/lang/String;");
  190. FTTIAP_SkuEnabled_5D001C = JEIEnv_5CFFE0->GetStaticMethodID(jclass_FTTIAP, "SkuEnabled", "(Ljava/lang/String;)Z");
  191. FTTIAP_AllPurchasesDisabled_5D0024 = JEIEnv_5CFFE0->GetStaticMethodID(jclass_FTTIAP, "AllPurchasesDisabled", "()Z");
  192. FTTIAP_GetIAPStatusCount_5D0028 = JEIEnv_5CFFE0->GetStaticMethodID(jclass_FTTIAP, "GetIAPStatusCount", "()I");
  193. FTTIAP_GetUserData_5D0020 = JEIEnv_5CFFE0->GetStaticMethodID(jclass_FTTIAP, "GetUserData", "()V");
  194. iap_product_5CFFE4 = new idp_product_info[count];
  195. dword_5CFFE8 = 0;
  196. max_products_5CFFEC = count;
  197. jstring skey = JEIEnv_5CFFE0->NewStringUTF(pkey);
  198. JEIEnv_5CFFE0->CallStaticVoidMethod(jclass_FTTIAP, FTTIAP_SetPublicKeyAndSkuCount_5CFFF0, skey, count);
  199. JEIEnv_5CFFE0->DeleteLocalRef(skey);
  200. JEIEnv_5CFFE0->DeleteLocalRef(jclass_FTTIAP);
  201. }
  202. //---------------------------------------------------------------------------------------------------------------------------------------------
  203. //00273BA8
  204. int IAP_PurchaseProduct(int a1) {
  205. if (IAP_GetProductPurchased(a1))
  206. return 0;
  207. JEIEnv_5CFFE0 = AndroidApp_GetJNI();
  208. jstring s = JEIEnv_5CFFE0->NewStringUTF(iap_product_5CFFE4[a1].name_0);
  209. jclass cFTTIAP = AndroidApp_FindFTTJavaClass("FTTIAP");
  210. JEIEnv_5CFFE0->CallStaticVoidMethod(cFTTIAP, FTTIAP_Buy_5D0010, s);
  211. JEIEnv_5CFFE0->DeleteLocalRef(cFTTIAP);
  212. return 1;
  213. }
  214. //---------------------------------------------------------------------------------------------------------------------------------------------
  215. //00274178
  216. void IAP_RefreshPurchases() {
  217. jclass cFTTIAP = AndroidApp_FindFTTJavaClass("FTTIAP");
  218. JEIEnv_5CFFE0->CallStaticVoidMethod(cFTTIAP, FTTIAP_QueryInventoryAsync_5CFFF8);
  219. JEIEnv_5CFFE0->DeleteLocalRef(cFTTIAP);
  220. }
  221. //---------------------------------------------------------------------------------------------------------------------------------------------
  222. //00273C94
  223. void IAP_SetStatus(EAndroidIAPState es) {
  224. jclass cFTTIAP = AndroidApp_FindFTTJavaClass("FTTIAP");
  225. const char *p = EAIAP_Stat_329BF0[es];
  226. jstring s = JEIEnv_5CFFE0->NewStringUTF(p);
  227. JEIEnv_5CFFE0->CallStaticVoidMethod(cFTTIAP, FTTIAP_SetStatusString_5CFFFC, s);
  228. JEIEnv_5CFFE0->DeleteLocalRef(cFTTIAP);
  229. }
  230. //---------------------------------------------------------------------------------------------------------------------------------------------
  231. //00273F7C
  232. int IAP_SkuEnabled(int a) {
  233. return 1;
  234. }
  235. //---------------------------------------------------------------------------------------------------------------------------------------------
  236. //00274148
  237. void IAP_Start() {
  238. jclass cFTTIAP = AndroidApp_FindFTTJavaClass("FTTIAP");
  239. JEIEnv_5CFFE0->CallStaticVoidMethod(cFTTIAP, FTTIAP_Init_5D0014);
  240. JEIEnv_5CFFE0->DeleteLocalRef(cFTTIAP);
  241. }
  242. //---------------------------------------------------------------------------------------------------------------------------------------------
  243. //00273B20
  244. void IAP_StoreProductLocalisedPrice(int index) {
  245. jstring sname = JEIEnv_5CFFE0->NewStringUTF(iap_product_5CFFE4[index].name_0);
  246. jclass cFTTIAP = AndroidApp_FindFTTJavaClass("FTTIAP");
  247. jobject d = JEIEnv_5CFFE0->CallStaticObjectMethod(cFTTIAP, FTTIAP_GetPrice_5D0018);
  248. if (d) {
  249. const char *pS = JEIEnv_5CFFE0->GetStringUTFChars(sname, nullptr);
  250. UTF8ToUnicode(iap_product_5CFFE4[index].wbuf_24, pS, 16);
  251. JEIEnv_5CFFE0->ReleaseStringUTFChars((jstring)d, pS);
  252. JEIEnv_5CFFE0->DeleteLocalRef(sname);
  253. }
  254. //loc_273B92
  255. JEIEnv_5CFFE0->DeleteLocalRef(cFTTIAP);
  256. }
  257. //---------------------------------------------------------------------------------------------------------------------------------------------
  258. //00274238
  259. void IAP_Update() {
  260. //empty
  261. LOGE("IAP_Update");
  262. }
  263. //---------------------------------------------------------------------------------------------------------------------------------------------