- 마지막 업데이트
PC SDK native 레퍼런스
SDK 버전 3.5.0 기준이에요. 항목 100개를 이름순으로 모은 통합 문서예요.
Contents
기본 연동 안내
종류 연동 안내 · 모듈 Base · 버전 3.5.0
Description
Stove PCSDK Native API 는 크게 C++ 메서드 형태와 C flat 함수 형태의 2가지 선언을 각각 제공하며, 환경에 따라 편의에 맞게 선택해 사용할 수 있어요.
- 일반적인 C/C++ 개발환경에서는 C++ 메서드 형태를 간편하게 사용할 수 있어요.
- C flat 함수는 C++ 문법을 사용할 수 없는 환경에서 사용이 가능해요. (golang, js 기반 게임엔진 플러그인 개발 등)
모든 SDK 오브젝트는 IStove* 불투명 포인터로 표현되며, Stove_<Interface>_<Method>(self, ...) 형식의 접근자 함수를 통해 속성에 접근해요.
헤더 파일은 단일 바이너리(BaseSDK) 통합에 따라 모듈별 4종 형태로 제공돼요.
| File | Role |
|---|---|
<module>_api.h | SDK 자유함수 (Stove_Initialize 등) 선언 |
<module>_types.h | C++ 환경: IStove* 인터페이스 정의 (순수 가상 함수). C 환경: 불투명 typedef struct |
<module>_misc.h | 열거형 정의 (EStove<Module>TypeKind, EStove<Module>MethodCode, EStove<Module>ResultCode) |
<module>_flat_api.h | 인터페이스 멤버에 대한 C flat 접근자 (Stove_<Interface>_<Method>) |
통합 헤더 stove_api.h — 5개 모듈(Base/IAP/Log/PCBang/View)의 위 4종 헤더(총 20개)를 모두 묶은 우산(umbrella) 헤더예요. #include "stove_api.h" 한 줄로 모든 모듈의 공개 C API 를 한 번에 포함할 수 있으므로, 개별 모듈 헤더를 따로 include 할 필요가 없어요. (필요한 모듈만 골라 개별 헤더를 include 하는 방식도 그대로 사용할 수 있어요.)
Declaration Forms
본 문서는 대상에 따라 아래 형태로 구분해 표기해요.
| Target | Notation |
|---|---|
SDK API 함수 (Stove_Initialize 등) | C flat 함수 (자유 함수, C/C++ 동일 시그니처) |
인터페이스 멤버 (GetNickName, SetGameId 등) | C++ 메서드 + C flat 함수 |
| 콜백 | 콜백 typedef |
- C++ 메서드:
*_types.h안의IStove*인터페이스 구조체에 정의된 멤버 함수예요. 대부분의 컴파일러는 C++ 을 지원하므로 이 형태를 그대로 사용해self->Method()처럼 직접 호출할 수 있어요. - C flat 함수:
*_api.h/*_flat_api.h에서extern "C"+__cdecl로 공개되는 진입점이에요. 순수 C 또는 C# 등 C++ vtable 호출이 불가능한 환경을 위해 제공되며, C++ 환경에서도 동일하게 호출할 수 있어요. - 두 형태는 동일한 동작을 수행해요. C flat 함수는 내부적으로 해당 객체의 C++ 메서드를 호출해요.
SDK API 함수(Stove_<Method>)는 인터페이스 멤버가 아닌 자유 함수예요. *_api.h 에서 extern "C" 로 선언되어, C++ 메서드와 C flat 함수(C/C# 환경) 모두 동일한 시그니처로 호출돼요. (예: IStoveResult* Stove_Initialize(const IStoveInitializeParam* initParam); — C 에서도 C++ 에서도 동일 호출)
헤더에는 각 C flat 함수의 함수 포인터 typedef (<함수명>_t) 도 함께 선언되어 있지만 본 문서에서는 별도 표기하지 않아요. 동적 로딩(GetProcAddress) 용도가 필요할 때만 참고하세요.
각 함수 문서의 ## Example 은 두 형태를 C · C++ 탭으로 나란히 싣어요. 같은 API 를 어느 쪽으로 호출해도 결과가 같으므로 프로젝트 환경에 맞는 탭 하나만 보면 돼요.
| Tab | 쓰는 곳 | 인터페이스 멤버 접근 | 객체 해제 |
|---|---|---|---|
C | C 프로젝트, 또는 vtable 호출을 쓸 수 없는 환경 | Stove_IStoveResult_IsSuccessful(result) | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result) |
C++ | *_types.h 의 인터페이스를 그대로 쓰는 C++ 프로젝트 | result->IsSuccessful() | result->Destroy() |
SDK API 함수(Stove_<Method>)는 두 탭에서 같아요. 달라지는 것은 인터페이스 멤버 접근과 해제 표기뿐이에요. 여기서 말하는 C++ 는 신규 인터페이스를 C++ 문법으로 호출하는 것이며, 구 C++ 인터페이스(Stove::PCSDK::<Module>, old_native/)와는 달라요.
Naming Rules
| Category | Pattern | Example |
|---|---|---|
| SDK 함수 | Stove_<Method> (모듈 토큰 없는 자유 함수) | Stove_Initialize, Stove_StartPurchase, Stove_FetchProducts |
| 파라미터 객체 통합 팩토리 | Stove_CreateParam(int kind) | Stove_CreateParam(k_EStoveBaseTypeKind_InitializeParam) |
| 인터페이스 접근자 | Stove_<Interface>_<Method> | Stove_IStoveUser_GetNickName(user) |
| 콜백 타입 | On<Action>Callback | OnRestartAppIfNecessaryCallback |
| 열거형 값 | k_E<Enum><Value> | k_EStoveCommonResultCode_Success |
Memory Lifetime
SDK 오브젝트는 IStoveTypeBase 가 가진 ShouldDestroy 플래그에 따라 해제 책임이 결정돼요.
일반 규칙 — 어떤 SDK 오브젝트든 다음 한 줄로 해제 여부를 판단할 수 있어요.
if (Stove_IStoveTypeBase_ShouldDestroy(obj)) // C++ 에서는 obj->ShouldDestroy()
Stove_IStoveTypeBase_Destroy(obj); // C++ 에서는 obj->Destroy()
객체의 출처(Factory 생성·동기 반환·out 파라미터·콜백 동반·Getter 반환)를 일일이 외울 필요 없이 ShouldDestroy() 의 반환값에 따라 Destroy 하면 누수도 이중 해제도 발생하지 않아요. 아래 표는 각 경로에서 ShouldDestroy 가 어떤 값을 반환하는지 참고용으로 정리한 것이에요.
Factory 로 생성한 객체는 반드시 호출자가 해제 — 통합 팩토리 Stove_CreateParam(<TypeKind>) 으로 반환된 모든 구조체 포인터는 ShouldDestroy == true 이며, 사용이 끝난 뒤 Stove_IStoveTypeBase_Destroy(obj) (C++ 에서는 obj->Destroy()) 를 호출해 반드시 해제해야 해요. 해제하지 않으면 메모리 누수가 발생해요.
// 예: Stove_CreateParam 으로 IStoveRestartAppIfNecessaryParam 생성
IStoveRestartAppIfNecessaryParam* restartParam = (IStoveRestartAppIfNecessaryParam*)
Stove_CreateParam(k_EStoveBaseTypeKind_RestartAppIfNecessaryParam);
Stove_IStoveRestartAppIfNecessaryParam_SetGameId(restartParam, L"my_game_id");
Stove_IStoveRestartAppIfNecessaryParam_SetAppKey(restartParam, L"my_app_key");
// ... 다른 setter 호출 ...
Stove_RestartAppIfNecessary(restartParam, OnRestartAppCallback, NULL);
// API 호출 반환 후 반드시 해제
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)restartParam);
| Creation Path | ShouldDestroy | Release |
|---|---|---|
Factory(Stove_CreateParam) 로 생성한 파라미터 객체 | true | 호출자가 반드시 해제 — API 호출이 끝난 뒤 Stove_IStoveTypeBase_Destroy(self) (C++ 에서는 self->Destroy()) |
동기 API 반환값 IStoveResult* | true | 호출자가 반드시 해제 — Stove_IStoveTypeBase_Destroy(result) |
out 파라미터로 받은 객체 (IStoveUser**, IStoveGds**, IStoveSignin**) | true | 호출자가 반드시 해제 — Stove_IStoveTypeBase_Destroy(*outXxx) |
비동기 콜백으로 전달되는 IStoveCallbackResult* 및 동반 객체(IStoveAccessToken*, IStoveProductList*, IStovePCBangBenefitInfo*, ...) | false | SDK 소유 — 콜백 종료 후 SDK 가 자동 해제. 호출자는 Destroy 하지 않음 |
상위 객체의 Getter 로 반환된 하위 객체 (예: IStoveProductList::GetAt() 의 IStoveProduct*) | false | 부모 객체가 소유 — 별도 해제 불필요 |
파라미터로 넘긴 구조체는 반드시 직접 해제해야 해요. Factory 로 생성한 IStoveTypeBase* 파생 객체를 API 호출의 매개변수로 전달한 후에도, 객체의 소유권은 호출자에게 남아 있어요. API 호출 반환 시점(동기 API) 또는 콜백 호출 완료 시점(비동기 API) 이후에 Stove_IStoveTypeBase_Destroy(obj) (C++ 에서는 obj->Destroy()) 를 호출해 해제하세요.
C 호출 예시 — Stove_StartPurchase() 에 주문 파라미터 전달 후 해제:
// 1) Factory 로 파라미터 객체들 생성
IStoveOrderProductParam* order = (IStoveOrderProductParam*)Stove_CreateParam(k_EStoveIAPTypeKind_OrderProductParam);
Stove_IStoveOrderProductParam_SetProductId(order, 12345);
Stove_IStoveOrderProductParam_SetQuantity(order, 1);
IStovePurchaseParam* option = (IStovePurchaseParam*)Stove_CreateParam(k_EStoveIAPTypeKind_PurchaseParam);
Stove_IStovePurchaseParam_SetOperation(option, k_EStovePurchaseOperation_WithWebViewAndConfirmResult);
IStoveStartPurchaseParam* params = (IStoveStartPurchaseParam*)Stove_CreateParam(k_EStoveIAPTypeKind_StartPurchaseParam);
IStoveOrderProductParam* products[] = { order };
Stove_IStoveStartPurchaseParam_SetProducts(params, products, 1);
Stove_IStoveStartPurchaseParam_SetPurchaseParam(params, option);
// 2) API 호출
// OnPopupDestroyed 는 결제 웹뷰가 닫힐 때 호출되는 IAP 콜백입니다.
Stove_StartPurchase(params, OnPurchaseFinished, OnPopupDestroyed, NULL, NULL);
// 3) API 호출 반환 이후, 전달한 파라미터 객체들을 모두 Destroy
// (호출자가 Factory 로 생성했으므로 ShouldDestroy == true)
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)params);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)option);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)order);
C++ 호출 예시 — 동일 시나리오, C++ 메서드 직접 호출:
auto* order = static_cast<IStoveOrderProductParam*>(
Stove_CreateParam(k_EStoveIAPTypeKind_OrderProductParam));
order->SetProductId(12345);
order->SetQuantity(1);
// ... (생략)
Stove_StartPurchase(params, OnPurchaseFinished, OnPopupDestroyed, nullptr, nullptr);
params->Destroy();
option->Destroy();
order->Destroy();
Initialization Order
초기화 파라미터는 두 종류의 객체로 나뉘어 있어요 — 런처 재실행 확인용 IStoveRestartAppIfNecessaryParam 과, 실제 초기화용 IStoveInitializeParam 이에요. 각각 따로 생성해 해당 함수에 넘겨요.
Stove_CreateParam(k_EStoveBaseTypeKind_RestartAppIfNecessaryParam)로 IStoveRestartAppIfNecessaryParam 생성Stove_IStoveRestartAppIfNecessaryParam_Set*()(또는 C++ 에서restartParam->SetXxx()) 로 환경/게임 ID/앱 키 등 설정- Stove_RestartAppIfNecessary(restartParam, callback, userData) 호출 — 비동기. SDK 가 별도 스레드에서 런처 실행 여부를 확인하며, 결과는 콜백으로 전달돼요.
- 게임 메인 루프에서 매 프레임 Stove_RunCallback() 을 호출하기 시작해요.
Stove_RestartAppIfNecessary()의 콜백은Stove_RunCallback()이 호출되는 시점에 디스패치되므로, 호출 직후부터Stove_RunCallback()루프가 돌아야 콜백을 받을 수 있어요. - 콜백에서
IsRestartRequired() == false면 아래 순서로 Stove_Initialize() 를 호출해요 — (IsRestartRequired() == true면 SDK 가 런처로 재실행하므로 현재 프로세스를 종료)Stove_CreateParam(k_EStoveBaseTypeKind_InitializeParam)로 IStoveInitializeParam 생성- View 를 함께 사용하려면
SetMainWndHandle(), IAP 를 함께 사용하려면SetShopKey()설정 Stove_Initialize(initParam)호출 — 동기,IStoveResult*즉시 반환. 설정된 값에 따라 View·IAP 모듈도 함께 초기화됨
- 반환된
IStoveResult*결과코드가 0(성공) 이면 사용 가능. 사용 후 Destroy - 게임이 실행되는 동안
Stove_RunCallback()루프를 계속 유지 (메인 스레드) - 종료 시 Stove_Uninitialize() 호출 (반환
IStoveResult*Destroy 필수) restartParam,initParam은 각각 사용이 끝난 뒤(콜백 완료 후 /Stove_Initialize()반환 후)Stove_IStoveTypeBase_Destroy()로 해제
Stove_RestartAppIfNecessary() 는 비동기 함수예요. 콜백은 SDK 내부 스레드가 아니라 Stove_RunCallback() 을 호출한 스레드에서 디스패치돼요. 따라서 Stove_RestartAppIfNecessary() 호출 후 게임 루프에서 Stove_RunCallback() 을 돌리지 않으면 콜백이 호출되지 않아 초기화가 진행되지 않아요.
Stove_Initialize(initParam) 은 동기 함수예요. 콜백을 받지 않으며 IStoveResult* 를 즉시 반환해요. 반드시 Stove_RestartAppIfNecessary() 콜백의 IsRestartRequired() == false 분기 안에서 호출하세요. 호출자는 결과코드를 확인한 뒤 Stove_IStoveTypeBase_Destroy(result) 로 해제하세요.
신규 인터페이스는 모듈별 초기화·종료가 없어요. Stove_Initialize() 한 번으로 결제·팝업·PC방·로그 등 모든 기능이 함께 동작해요.
Callback Execution Rules
- 모든 비동기 API 의 콜백은
__cdecl호출 규약을 사용해요. - 콜백은
Stove_RunCallback()을 호출한 스레드(메인/UI 스레드)에서 실행돼요. SDK 내부 스레드가 아니에요. - 콜백 파라미터로 전달된
IStoveCallbackResult*및 동반 객체 포인터는 콜백 호출 동안에만 유효 해요.Destroy()하지 않아요. - 1회성 콜백(
VietnamAgeRating,VietnamOverimmersion등)은 렌더링이 가능한 시점 이후에 호출되어야 해요. - 비동기 API 의
onFinished콜백은 필수 매개변수예요. 지정하지 않으면k_EStoveCommonResultCode_InvalidParam(5) 이 발생해요.
userData Parameter Rules
비동기 API 들은 콜백 함수와 함께 void* userData 매개변수를 받아요. 이 값은 SDK 가 해석하지 않고 콜백 호출 시점에 그대로 다시 전달돼요. 게임(개발사) 측에서 콜백 안으로 임의의 컨텍스트 데이터를 운반하기 위한 통로예요.
사용 패턴: 게임 코드의 객체 포인터, 요청 ID, 진행 중인 작업 식별자 등 콜백 안에서 활용할 정보를 전달해요. 콜백 안에서는 IStoveCallbackResult::GetUserData() (C 에서는 Stove_IStoveCallbackResult_GetUserData(callbackResult)) 로 다시 꺼내요.
메모리 수명 :
void*포인터 타입이므로 SDK 는 해당 메모리에 대해 어떤 관리도 수행하지 않아요. 할당·해제·수명·스레드 안전성 모두 개발사에서 개발시 주의를 기울여야 해요.- 일회성 콜백(StartPurchase, FetchProducts 등)에서는 콜백이 정확히 1회 호출된 뒤 안전하게 해제할 수 있어요.
- 반복 호출 콜백(
Stove_AccessTokenRenewed,Stove_OverImmersionNotification,Stove_PCBangLogin의onRefreshBenefit등)에서는 SDK 가 종료되거나 등록이 해제될 때까지userData가 살아 있어야 해요. userData가 스택 변수나 임시 객체를 가리키지 않도록 주의하세요. 콜백 시점에는 이미 그 스코프가 종료되어 댕글링 포인터가 돼요.- 두 개의 콜백(
onFinished,onDestroy등)을 받는 함수는userData1,userData2가 독립적으로 동작해요. 각 콜백 수명에 맞춰 별도로 해제하세요.
SDK 는 userData 의 내용·크기·소유권에 대해 어떤 가정도 하지 않아요. NULL 전달도 허용돼요. 사용하지 않으면 NULL 을 전달하세요.
C 예시 — 게임 측에서 컨텍스트 구조체를 동적 할당해 전달하고, 콜백에서 사용 후 해제:
typedef struct GamePurchaseCtx
{
int requestId;
void* uiHandle;
} GamePurchaseCtx;
void __cdecl OnPurchaseFinished(const IStoveCallbackResult* result, const IStoveStartPurchaseOutcome* purchase)
{
GamePurchaseCtx* ctx = (GamePurchaseCtx*)Stove_IStoveCallbackResult_GetUserData(result);
// ctx->requestId, ctx->uiHandle 사용해 게임 측 후처리
free(ctx); // 호출자가 직접 해제 — SDK 는 관여하지 않음
}
// 호출부
GamePurchaseCtx* ctx = (GamePurchaseCtx*)malloc(sizeof(GamePurchaseCtx));
ctx->requestId = 12345;
ctx->uiHandle = myUiHandle;
Stove_StartPurchase(params, OnPurchaseFinished, OnPopupDestroyed, ctx, NULL);
// ^^^ ^^^^
// userData1 (onFinished)
// userData2 (onDestroy) — 사용 안 함
위 예시에서 ctx 가 OnPurchaseFinished 콜백 호출 전에 해제되면 댕글링 포인터로 인해 크래시가 발생해요. 콜백이 호출되기 전까지 ctx 의 수명을 반드시 유지하세요.
Common Interface
모든 모듈이 공유하는 타입은 각 문서로 링크만 해요. 내용은 각 문서에서 확인하세요.
- IStoveTypeBase — 모든 SDK 오브젝트의 최상위 인터페이스예요. 런타임 타입 식별과 해제 수명(
ShouldDestroy/Destroy)을 담당해요. - IStoveResult — 동기 API 호출 결과예요. 메서드 코드와 결과 코드를 담아요.
- IStoveCallbackResult — 비동기 콜백으로 전달되는 결과예요. 콜백 호출 동안에만 유효해요.
| Type | Document |
|---|---|
IStoveTypeBase | IStoveTypeBase |
IStoveResult | IStoveResult |
IStoveCallbackResult | IStoveCallbackResult |
Notes
Stove_RestartAppIfNecessary()는 반드시Stove_Initialize()보다 먼저 호출해야 하며, 그 콜백을 받으려면 호출 직후부터Stove_RunCallback()을 게임 루프에서 돌리고 있어야 해요.Stove_Initialize()는 동기 함수라 콜백을 받지 않지만,Stove_RestartAppIfNecessary()의 콜백 안(IsRestartRequired() == false분기)에서 호출해야 해요.userData는 SDK 가 관리하지 않는void*이므로, 스택 변수나 임시 객체를 가리키게 두면 콜백 시점에 댕글링 포인터가 돼요.
See Also
| Document | Content |
|---|---|
| Stove_CreateParam | 파라미터 객체 통합 팩토리 |
| IStoveRestartAppIfNecessaryOutcome | Stove_RestartAppIfNecessary() 콜백으로 전달되는 결과 (IsRestartRequired()) |
EStoveBaseMethodCode
종류 열거형 · 모듈 Base · 버전 3.5.0
Description
IStoveResult::GetMethodCode() 로 조회하는 값으로, 어떤 SDK 메서드가 이 결과를 생성했는지 식별해요. 로깅과 오류 라우팅에 사용해요.
Declaration
typedef enum EStoveBaseMethodCode
{
k_EStoveBaseMethodCode_Invalid = -1,
k_EStoveBaseMethodCode_BaseInitialize = 1,
// ... 이하 열거값 표 참조
k_EStoveBaseMethodCode_GetTranslateLanguage = 119U,
k_EStoveBaseMethodCode_Max = 0x7fffffff
} EStoveBaseMethodCode;
Enum Values
Lifecycle / Versioning
| Code | Name | Description |
|---|---|---|
| -1 | k_EStoveBaseMethodCode_Invalid | 사용하지 않아요 |
| 1 | k_EStoveBaseMethodCode_BaseInitialize | Stove_Initialize |
| 2 | k_EStoveBaseMethodCode_BaseUninitialize | Stove_Uninitialize |
| 5 | k_EStoveBaseMethodCode_BaseGetVersion | Stove_GetVersion |
| — | 6 ~ 63 | 사용하지 않아요 (예약 구간) |
Public APIs
| Code | Name | Description |
|---|---|---|
| 64 | k_EStoveBaseMethodCode_GetAccessToken | Stove_GetAccessToken |
| 65 | k_EStoveBaseMethodCode_AccessTokenRenewed | Stove_AccessTokenRenewed |
| 66 | k_EStoveBaseMethodCode_GetUser | Stove_GetUser |
| 67 | k_EStoveBaseMethodCode_SetLanguage | Stove_SetLanguage |
| 68 | k_EStoveBaseMethodCode_OverImmersionNotification | Stove_OverImmersionNotification |
| 69 | k_EStoveBaseMethodCode_ShutdownNotification | Stove_ShutdownNotification |
| — | 70, 71 | 사용하지 않아요 (내부 전용으로 폐기된 예약 번호) |
| 72 | k_EStoveBaseMethodCode_SetGameProfile | Stove_SetGameProfile |
| 73 | k_EStoveBaseMethodCode_GetGds | Stove_GetGds |
| 74 | k_EStoveBaseMethodCode_GetSignin | Stove_GetSignin |
| 75 | k_EStoveBaseMethodCode_RestartAppIfNecessary | Stove_RestartAppIfNecessary |
| 76 | k_EStoveBaseMethodCode_RestartAppIfNecessaryAsync | Stove_RestartAppIfNecessary 의 비동기 처리 경로 |
| 77 | k_EStoveBaseMethodCode_OpenExternalUrl | Stove_OpenExternalUrl |
| 78 | k_EStoveBaseMethodCode_GetCloudSavingPath | Stove_GetCloudSavingPath — 스토어인디 전용 |
| 79 | k_EStoveBaseMethodCode_VietnamAgeRatingNotification | Stove_VietnamAgeRatingNotification |
| 80 | k_EStoveBaseMethodCode_VietnamOverimmersionNotification | Stove_VietnamOverimmersionNotification |
| 81 | k_EStoveBaseMethodCode_CloseAllPopups | Stove_CloseAllPopups(단일 바이너리 통합 — IAP+View 팝업을 함께 닫아요) |
| — | 82 ~ 95 | 사용하지 않아요 (예약 구간) |
Private getters (다른 SDK 모듈에 노출되는 비공개 게터 — 게임에는 노출되지 않음)
| Code | Name | Description |
|---|---|---|
| 115 | k_EStoveBaseMethodCode_GetEnvPrivate | 비공개 게터 — 다른 SDK 모듈 전용, 게임에는 노출되지 않아요 |
| 116 | k_EStoveBaseMethodCode_GetGameIdPrivate | 비공개 게터 — 다른 SDK 모듈 전용, 게임에는 노출되지 않아요 |
| 117 | k_EStoveBaseMethodCode_GetMemberNoPrivate | 비공개 게터 — 다른 SDK 모듈 전용, 게임에는 노출되지 않아요 |
| 118 | k_EStoveBaseMethodCode_GetPublicIp | 비공개 게터 — 다른 SDK 모듈 전용, 게임에는 노출되지 않아요 |
| 119 | k_EStoveBaseMethodCode_GetTranslateLanguage | 비공개 게터 — 다른 SDK 모듈 전용, 게임에는 노출되지 않아요 |
기타
| Code | Name | Description |
|---|---|---|
| — | 120 ~ 0x7ffffffe | 사용하지 않아요 (예약 구간) |
| 0x7fffffff | k_EStoveBaseMethodCode_Max | 사용하지 않아요 |
이름에 Internal 이 들어간 값(3, 4, 96 ~ 108, 110 ~ 114)은 SDK 내부 전용이며 표에서 제외했어요. 109 는 소스에 이름 없이 "Deprecated" 주석만 있는 예약 번호예요.
Example
IStoveResult* result = Stove_Initialize(initParam);
if (Stove_IStoveResult_GetMethodCode(result) == k_EStoveBaseMethodCode_BaseInitialize)
{
// 이 결과가 Stove_Initialize() 호출로 생성되었음을 확인하는 로직을 구현해 주세요.
}
Notes
- 96번대 이후의 Internal 메서드 코드는 재생시간 보고, 서버 설정, 토큰 처리 등 SDK 내부 동작에 사용되며 게임에서 직접 호출하는 API 와 대응하지 않아요.
- 115~119번의 Private 게터는 이름에
Internal이 없어 표에 포함했지만, 다른 SDK 모듈에만 노출되는 비공개 API 이며 게임에는 제공되지 않아요. - 3, 4 번(
InternalSend81Plug,InternalUpdate81Plug)도 이름에Internal이 들어가 있어 표에서 제외했어요. - 옛 인터페이스에서는 값 이름에 밑줄이 없었어요(예:
k_EStoveBaseMethodCodeInvalid). 현재 인터페이스는k_EStoveBaseMethodCode_Invalid처럼 타입명과 값명 사이에 밑줄이 들어가요.
Changelog
| Version | Change |
|---|---|
| 3.5.0 | 최초 제공 |
See Also
EStoveBaseTypeKind
종류 열거형 · 모듈 Base · 버전 3.5.0
Description
IStoveTypeBase 인스턴스의 구체적인 타입을 식별하는 값이에요. Stove_CreateParam() 에 특정 파라미터 객체를 요청할 때, 그리고 IStoveTypeBase::GetTypeKind() 로 런타임 타입을 식별할 때 사용해요.
값 범위는 0 ~ 999 예요. SDK 가 반환/전달하는 결과·데이터 타입과, 호출자가 Stove_CreateParam() 으로 생성하는 파라미터 타입으로 나뉘어요. 이 범위는 다른 SDK 모듈의 TypeKind 열거형과 겹치지 않도록 설계되어 있어, Stove_CreateParam() 하나로 모든 모듈의 파라미터를 생성할 수 있어요.
Declaration
typedef enum EStoveBaseTypeKind
{
k_EStoveBaseTypeKind_Invalid = -1,
k_EStoveBaseTypeKind_Base = 0,
// ... 이하 열거값 표 참조
k_EStoveBaseTypeKind_SetGameProfileParam = 502,
k_EStoveBaseTypeKind_Max = 0x7fffffff,
} EStoveBaseTypeKind;
Enum Values
Result / Data types (SDK 가 반환하거나 콜백으로 전달)
| Code | Name | Description |
|---|---|---|
| -1 | k_EStoveBaseTypeKind_Invalid | 사용하지 않아요 |
| 0 | k_EStoveBaseTypeKind_Base | IStoveTypeBase |
| 1 | k_EStoveBaseTypeKind_StoveResult | IStoveResult |
| 2 | k_EStoveBaseTypeKind_StoveCallbackResult | IStoveCallbackResult |
| 3 | k_EStoveBaseTypeKind_StoveUser | IStoveUser |
| 4 | k_EStoveBaseTypeKind_StoveAccessToken | IStoveAccessToken |
| 5 | k_EStoveBaseTypeKind_StoveGds | IStoveGds |
| 6 | k_EStoveBaseTypeKind_StoveSignin | IStoveSignin |
| 7 | k_EStoveBaseTypeKind_StoveOverImmersionInfo | IStoveOverImmersionInfo |
| 8 | k_EStoveBaseTypeKind_StoveVietnamAgeRatingInfo | IStoveVietnamAgeRatingInfo |
| 9 | k_EStoveBaseTypeKind_StoveVietnamOverimmersionInfo | IStoveVietnamOverimmersionInfo |
| 10 | k_EStoveBaseTypeKind_StoveShutdownInfo | IStoveShutdownInfo |
| 11 | k_EStoveBaseTypeKind_StoveRestartAppIfNecessaryOutcome | IStoveRestartAppIfNecessaryOutcome |
| — | 12 ~ 499 | 사용하지 않아요 (결과/데이터 타입과 파라미터 타입 구간 사이의 예약 구간) |
Parameter types (호출자가 Stove_CreateParam() 으로 생성)
| Code | Name | Description |
|---|---|---|
| 500 | k_EStoveBaseTypeKind_RestartAppIfNecessaryParam | IStoveRestartAppIfNecessaryParam |
| 501 | k_EStoveBaseTypeKind_InitializeParam | IStoveInitializeParam |
| 502 | k_EStoveBaseTypeKind_SetGameProfileParam | IStoveSetGameProfileParam |
| — | 503 ~ 0x7ffffffe | 사용하지 않아요 (예약 구간) |
| 0x7fffffff | k_EStoveBaseTypeKind_Max | 사용하지 않아요 |
Example
IStoveSetGameProfileParam* profileParam =
(IStoveSetGameProfileParam*)Stove_CreateParam(k_EStoveBaseTypeKind_SetGameProfileParam);
Notes
- 파라미터 타입(500번대)은
Stove_CreateParam()인자로 사용돼요. 결과/데이터 타입(0~11번)은 SDK 가 반환하거나 콜백으로 전달하므로 직접 생성하지 않아요. - 옛 인터페이스에서는 값 이름에 밑줄이 없었어요(예:
k_EStoveBaseTypeKindInvalid). 현재 인터페이스는k_EStoveBaseTypeKind_Invalid처럼 타입명과 값명 사이에 밑줄이 들어가요. - 옛 인터페이스에는
IStoveInitializeParam이 Environment/GameId/AppKey 를 포함한 더 큰 구조체였으나, 현재는 그 필드들이 500번(RestartAppIfNecessaryParam)으로 분리되었고 501번(InitializeParam)은 ShopKey/MainWndHandle 만 담아요.
Changelog
| Version | Change |
|---|---|
| 3.5.0 | 최초 제공 |
See Also
EStoveCommonResultCode
종류 결과코드 · 모듈 Base · 버전 3.5.0
Description
모든 Stove SDK 모듈이 공통으로 사용하는 결과 코드예요. IStoveResult::GetResultCode() 로 조회하며, 0(Success)이면 성공이에요.
모듈별 전용 결과 코드(300~)는 EStoveResultCode 를 참조하세요.
Declaration
typedef enum EStoveCommonResultCode
{
k_EStoveCommonResultCode_Success = 0,
k_EStoveCommonResultCode_Fail = 1,
// ... 이하 열거값 표 참조
k_EStoveCommonResultCode_UnknownError = 255,
k_EStoveCommonResultCode_Max = 0x7fffffff
} EStoveCommonResultCode;
Enum Values
일반 결과
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 1 | k_EStoveCommonResultCode_Fail | 일반 실패 | x |
설정/파라미터 검증 실패
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 2 | k_EStoveCommonResultCode_InvalidConfig | 설정값이 유효하지 않아요 | x | |
| 3 | k_EStoveCommonResultCode_InvalidLogLevel | 로그 레벨 값이 유효하지 않아요 | x | |
| 4 | k_EStoveCommonResultCode_InvalidLogPath | 로그 경로가 유효하지 않아요 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | 파라미터가 유효하지 않아요 | x | |
| — | 6 ~ 15 | 사용하지 않아요 (예약 구간) | — | — |
초기화 상태 오류
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 16 | k_EStoveCommonResultCode_BaseNotInitialized | SDK 가 초기화되지 않았어요 | x | |
| 17 | k_EStoveCommonResultCode_NotInitialized | 해당 모듈이 초기화되지 않았어요 | x | |
| 18 | k_EStoveCommonResultCode_AlreadyInitialized | 이미 초기화되어 있어요 | x |
토큰/엔티티 오류
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 19 | k_EStoveCommonResultCode_InvalidAccessToken | AccessToken 이 유효하지 않아요 | O | 로그인 세션이 만료되었습니다. 게임 종료 후 다시 실행해 주세요. [확인] |
| 20 | k_EStoveCommonResultCode_NullTokenEntity | 토큰 엔티티가 null 이에요 | x | |
| 21 | k_EStoveCommonResultCode_NullEntity | 엔티티가 null 이에요 | x |
아래 코드를 받으면 반드시 게임을 종료해야 해요. 정상 진행이 불가능한 상태예요.
19k_EStoveCommonResultCode_InvalidAccessToken— 로그인 세션이 만료되어 재실행이 필요해요
HTTP/응답 오류
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 22 | k_EStoveCommonResultCode_HttpError | HTTP 오류가 발생했어요 | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
| 23 | k_EStoveCommonResultCode_ResponseError | 서버 응답 오류예요 | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
| 24 | k_EStoveCommonResultCode_ResponseInvalidCode | 서버 응답 코드가 유효하지 않아요 | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
| 25 | k_EStoveCommonResultCode_ResponseValueIsNull | 서버 응답 값이 null 이에요 | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
| 26 | k_EStoveCommonResultCode_ResponseInvalidValueFormat | 서버 응답 값의 형식이 유효하지 않아요 | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
기타 상태
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| — | 27, 28 | 사용하지 않아요 (폐기된 번호) | — | — |
| 29 | k_EStoveCommonResultCode_AsyncOperationInProgress | 비동기 작업이 이미 진행 중이에요 | x | |
| 30 | k_EStoveCommonResultCode_BaseUninitialized | SDK 가 이미 해제(Stove_Uninitialize)되었어요 | x | |
| 31 | k_EStoveCommonResultCode_NotSupportedCountry | 지원하지 않는 국가/지역이에요 | x | |
| 33 | k_EStoveCommonResultCode_PopupNotCreated | 팝업이 생성되지 않고 작업이 종료되었어요. 내부 정리 전용 코드이며 게임 콜백으로 전달되지 않아요(모든 인터페이스가 가로채요) | x | |
| 34 | k_EStoveCommonResultCode_WebviewClosedBeforeComplete | 작업이 끝나기 전에 웹뷰가 닫혔어요 | O | 구매가 정상적으로 완료되지 않았습니다. 다시 시도해 주세요. [확인] |
Local DB 실패 (모든 모듈 공용)
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 40 | k_EStoveCommonResultCode_LocalDbCreateWorkingDirectoryFailed | 로컬 DB 작업 디렉터리 생성에 실패했어요 | x | |
| 41 | k_EStoveCommonResultCode_LocalDbConnectFailed | 로컬 DB 연결에 실패했어요 | x | |
| 42 | k_EStoveCommonResultCode_LocalDbCreateTableFailed | 로컬 DB 테이블 생성에 실패했어요 | x | |
| 43 | k_EStoveCommonResultCode_LocalDbDisconnectFailed | 로컬 DB 연결 해제에 실패했어요 | x | |
| 44 | k_EStoveCommonResultCode_LocalDbWriteFailed | 로컬 DB 쓰기에 실패했어요 | x | |
| — | 45 ~ 59 | 사용하지 않아요 (향후 Local DB/페이로드/스토리지 코드를 위한 예약 구간) | — | — |
웹뷰/팝업 UI 실패 (모듈 공용)
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 60 | k_EStoveCommonResultCode_ViewUiNotInitialized | 팝업/웹뷰 UI 서브시스템이 초기화되지 않았어요 | x | |
| 61 | k_EStoveCommonResultCode_ViewUiUninitFailed | 팝업/웹뷰 UI 서브시스템 종료에 실패했어요 | x | |
| 62 | k_EStoveCommonResultCode_WebviewCreateFail | 웹뷰 생성에 실패했어요 | x | |
| 63 | k_EStoveCommonResultCode_WebviewLoadUrlFail | 웹뷰에서 URL 로드에 실패했어요 | x | |
| 64 | k_EStoveCommonResultCode_WebviewCreateCookieFail | 웹뷰 쿠키 설정에 실패했어요 | O | 페이지를 불러올 수 없습니다. 다시 시도해 주세요. [확인] |
| 65 | k_EStoveCommonResultCode_WebviewCloseAllFail | 모든 웹뷰/팝업 닫기에 실패했어요 | x | |
| 66 | k_EStoveCommonResultCode_WebviewCloseFail | 웹뷰/팝업 닫기에 실패했어요 | x | |
| 67 | k_EStoveCommonResultCode_NoPopupData | 표시할 팝업 데이터가 없어요 | O | 팝업 설정 정보가 존재하지 않아 표시할 창이 없습니다. [확인] |
| 68 | k_EStoveCommonResultCode_CloseAllPopupsFailed | Stove_CloseAllPopups 호출에서 하나 이상의 팝업을 닫지 못했어요(IAP+View 통합 호출) | x | |
| — | 69 ~ 79 | 사용하지 않아요 (향후 웹뷰/팝업 UI 코드를 위한 예약 구간) | — | — |
파라미터/페이로드 검증 (모듈 공용)
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 80 | k_EStoveCommonResultCode_ParameterLengthExceeded | 요청 파라미터가 최대 길이를 초과했어요 | O | 결제 정보가 유효하지 않아 결제를 진행할 수 없습니다. 다시 시도해 주세요. [확인] |
| 81 | k_EStoveCommonResultCode_InvalidJsonString | JSON 문자열 형식이 유효하지 않아요 | O | 결제 정보가 유효하지 않아 결제를 진행할 수 없습니다. 다시 시도해 주세요. [확인] |
| 82 | k_EStoveCommonResultCode_PayloadSizeExceeded | 페이로드가 허용된 최대 크기를 초과했어요 | x | |
| — | 83 ~ 248 | 사용하지 않아요 (예약 구간) | — | — |
네트워크 전송 실패
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 249 | k_EStoveCommonResultCode_NetworkTransportError | 네트워크 전송 오류예요. IStoveCallbackResult::GetExternalError() 로 HTTP 백엔드의 네이티브 오류 코드가 전달돼요(예: WinHTTP 12002/12007/12029) | x | |
| — | 250 | 사용하지 않아요 (예약 구간) | — | — |
시스템/런타임 실패
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 251 | k_EStoveCommonResultCode_PcsdkDllNotFound | PCSDK DLL 을 찾을 수 없어요 | x | |
| 252 | k_EStoveCommonResultCode_NotImplemented | 구현되지 않은 기능이에요 | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 관리되지 않는(unmanaged) 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 관리되는(managed) 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 255 | k_EStoveCommonResultCode_UnknownError | 알 수 없는 오류예요 | x | |
| — | 256 ~ 0x7ffffffe | 사용하지 않아요 (예약 구간) | — | — |
| 0x7fffffff | k_EStoveCommonResultCode_Max | 사용하지 않아요 | — | — |
Example
IStoveResult* result = Stove_Uninitialize();
if (Stove_IStoveResult_GetResultCode(result) == k_EStoveCommonResultCode_Success)
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
Notes
- 모든 API 및 다른 SDK 모듈이 공통으로 사용하는 결과 코드예요.
- 모듈별 전용 코드는 EStoveResultCode(300~)로 정의되며, 번호가 이 열거형과 겹치지 않도록 구간을 나눠 사용해요. 옛 인터페이스의 모듈별
EStoveBaseResultCode,EStoveIAPResultCode등은 더 이상 존재하지 않아요. - 옛 인터페이스에서는 값 이름에 밑줄이 없었어요(예:
k_EStoveCommonResultCodeSuccess). 현재 인터페이스는k_EStoveCommonResultCode_Success처럼 타입명과 값명 사이에 밑줄이 들어가요.
Changelog
| Version | Change |
|---|---|
| 3.5.0 | 최초 제공 (단일 바이너리 통합으로 모듈별 중복 코드를 이 열거형으로 통합) |
See Also
EStoveDiscountType
종류 열거형 · 모듈 IAP · 버전 3.5.0
Description
IStoveProduct 의 DiscountType 으로 반환되며, DiscountTypeValue 를 어떻게 해석할지를 결정해요.
Declaration
typedef enum EStoveDiscountType
{
k_EStoveDiscountType_None = 0,
k_EStoveDiscountType_FixedRate = 1,
k_EStoveDiscountType_FlatRate = 2,
k_EStoveDiscountType_Max = 0x7fffffff
} EStoveDiscountType;
Enum Values
| Code | Name | Description |
|---|---|---|
| 0 | k_EStoveDiscountType_None | 할인 없음 |
| 1 | k_EStoveDiscountType_FixedRate | 비율 할인(예: 10% 할인) — DiscountTypeValue 는 퍼센트 값이에요. |
| 2 | k_EStoveDiscountType_FlatRate | 정액 할인(예: $2 할인) — DiscountTypeValue 는 상품 통화 기준 할인액이에요. |
| 0x7fffffff | k_EStoveDiscountType_Max | 사용하지 않아요 |
Example
int32_t discountType = Stove_IStoveProduct_GetDiscountType(product);
int32_t discountValue = Stove_IStoveProduct_GetDiscountTypeValue(product);
if (discountType == k_EStoveDiscountType_FixedRate)
{
// discountValue 를 퍼센트로 해석해 주세요.
}
else if (discountType == k_EStoveDiscountType_FlatRate)
{
// discountValue 를 상품 통화 기준 정액으로 해석해 주세요.
}
Notes
- IStoveProduct::DiscountTypeValue 의 단위는 이 값에 따라 달라져요.
See Also
EStoveIAPMethodCode
종류 열거형 · 모듈 IAP · 버전 3.5.0
Description
IStoveResult::GetMethodCode() 로 조회하며, 어느 결제 API 호출이 이 결과를 만들었는지 식별해요. 로그 기록이나 오류 처리를 API 별로 분기할 때 사용해요.
값의 범위는 2000~2999 로, 결제 기능의 공개 API 순서대로 순차 배정되어 있어요.
Declaration
typedef enum EStoveIAPMethodCode
{
k_EStoveIAPMethodCode_Invalid = -1,
k_EStoveIAPMethodCode_FetchShopCategories = 2000,
// ... 이하 열거값 표 참조
k_EStoveIAPMethodCode_Max = 0x7fffffff
} EStoveIAPMethodCode;
Enum Values
| Code | Name | Description |
|---|---|---|
| -1 | k_EStoveIAPMethodCode_Invalid | 사용하지 않아요 |
| 2000 | k_EStoveIAPMethodCode_FetchShopCategories | Stove_FetchShopCategories |
| 2001 | k_EStoveIAPMethodCode_FetchProducts | Stove_FetchProducts |
| 2002 | k_EStoveIAPMethodCode_StartPurchase | Stove_StartPurchase |
| 2003 | k_EStoveIAPMethodCode_ConfirmPurchase | Stove_ConfirmPurchase |
| 2004 | k_EStoveIAPMethodCode_FetchInventory | Stove_FetchInventory |
| 2005 | k_EStoveIAPMethodCode_FetchTermsAgreement | Stove_FetchTermsAgreement |
| 2006 | k_EStoveIAPMethodCode_WithdrawGame | Stove_WithdrawGame — 로스트아크모바일 전용 |
| 0x7fffffff | k_EStoveIAPMethodCode_Max | 사용하지 않아요 |
Example
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
uint32_t methodCode = Stove_IStoveResult_GetMethodCode(result);
if (methodCode == k_EStoveIAPMethodCode_StartPurchase)
{
// Stove_StartPurchase() 호출에서 발생한 결과입니다.
}
Notes
- 값의 범위(2000 ~ 2006)가 EStoveIAPTypeKind 의 데이터 타입 값 범위(2000 ~ 2005)와 숫자가 겹치는 것처럼 보이지만, 서로 다른 열거형이므로 혼동하지 않도록 주의해요.
- 이전 인터페이스에 있던 모듈별
EStoveIAPResultCode는 삭제되었어요. 실패 원인은 이 메서드 코드와 함께 EStoveResultCode 또는 EStoveCommonResultCode 의GetResultCode()값으로 확인해요.
See Also
EStoveIAPTypeKind
종류 열거형 · 모듈 IAP · 버전 3.5.0
Description
Stove_CreateParam() 에 전달해 원하는 결제 파라미터 객체를 생성할 때 사용하며, IStoveTypeBase::GetTypeKind() 로 객체의 실제 타입을 런타임에 확인할 때도 사용해요.
값의 범위는 2000~2999 예요. 이 중 2000번대는 SDK 가 콜백으로 전달하는 결과/데이터 타입이고, 2500번대는 호출자가 Stove_CreateParam() 으로 생성하는 파라미터 타입이에요.
Declaration
typedef enum EStoveIAPTypeKind
{
k_EStoveIAPTypeKind_Invalid = -1,
k_EStoveIAPTypeKind_ShopCategory = 2000,
// ... 이하 열거값 표 참조
k_EStoveIAPTypeKind_Max = 0x7fffffff
} EStoveIAPTypeKind;
Enum Values
| Code | Name | Description |
|---|---|---|
| -1 | k_EStoveIAPTypeKind_Invalid | 사용하지 않아요 |
| 2000 | k_EStoveIAPTypeKind_ShopCategory | IStoveShopCategory — 상점 카테고리 항목 |
| 2001 | k_EStoveIAPTypeKind_Product | IStoveProduct — 상품 항목 |
| 2002 | k_EStoveIAPTypeKind_StartPurchaseOutcome | IStoveStartPurchaseOutcome — 구매 시작 결과 (옛 이름: PurchaseResult) |
| 2003 | k_EStoveIAPTypeKind_PurchasedProduct | IStovePurchasedProduct — 구매 확정된 상품 항목 |
| 2004 | k_EStoveIAPTypeKind_ChargeInfo | IStoveChargeInfo — 결제 화폐(차지) 정보 |
| 2005 | k_EStoveIAPTypeKind_InventoryItem | IStoveInventoryItem — 인벤토리(구매 내역) 항목 |
| — | 2006 | 사용하지 않아요 (예약 번호) |
| — | 2007 | 사용하지 않아요 (환불 조회(VoidedPurchasesEx) 기능이 소스에서 삭제되어 예약 번호로 남음) |
| 2008 | k_EStoveIAPTypeKind_ConfirmPurchaseOutcome | IStoveConfirmPurchaseOutcome — 구매 확정 결과 |
| 2009 | k_EStoveIAPTypeKind_WithdrawGameOutcome | IStoveWithdrawGameOutcome — 게임 탈퇴 결과 (로스트아크모바일 전용) |
| 2010 | k_EStoveIAPTypeKind_TermsAgreementOutcome | IStoveTermsAgreementOutcome — 약관 동의 조회 결과 |
| 2011 | k_EStoveIAPTypeKind_ShopCategoryList | IStoveShopCategoryList — 상점 카테고리 목록 컨테이너 |
| 2012 | k_EStoveIAPTypeKind_ProductList | IStoveProductList — 상품 목록 컨테이너 |
| 2013 | k_EStoveIAPTypeKind_InventoryList | IStoveInventoryList — 인벤토리(구매 내역) 목록 컨테이너 |
| 2500 | k_EStoveIAPTypeKind_FetchProductsParam | IStoveFetchProductsParam — 상품 조회 파라미터 |
| 2501 | k_EStoveIAPTypeKind_OrderProductParam | IStoveOrderProductParam — 주문 상품 파라미터 |
| 2502 | k_EStoveIAPTypeKind_PurchaseParam | IStovePurchaseParam — 구매 동작 파라미터 |
| 2503 | k_EStoveIAPTypeKind_StartPurchaseParam | IStoveStartPurchaseParam — 구매 시작 파라미터 |
| 2504 | k_EStoveIAPTypeKind_FetchTermsAgreementParam | IStoveFetchTermsAgreementParam — 약관 동의 조회 파라미터 |
| — | 2505 | 사용하지 않아요 (예약 번호) |
| 2506 | k_EStoveIAPTypeKind_WithdrawGameParam | IStoveWithdrawGameParam — 게임 탈퇴 파라미터 (로스트아크모바일 전용) |
| 2507 | k_EStoveIAPTypeKind_ConfirmPurchaseParam | IStoveConfirmPurchaseParam — 구매 확정 파라미터 |
| — | 2508 | 사용하지 않아요 (환불 조회(FetchVoidedPurchasesExParam) 기능이 소스에서 삭제되어 예약 번호로 남음) |
| 0x7fffffff | k_EStoveIAPTypeKind_Max | 사용하지 않아요 |
IStoveWebViewLayoutParam 은 IStovePurchaseParam · IStoveFetchTermsAgreementParam · IStoveWithdrawGameParam 이 공유하는 추상 베이스 타입으로, 이 열거형에 대응하는 값이 없어요. Stove_CreateParam() 으로 단독 생성할 수 없어요.
내부 전용 값은 표에서 제외했어요.
Example
IStoveFetchProductsParam* param = (IStoveFetchProductsParam*)Stove_CreateParam(k_EStoveIAPTypeKind_FetchProductsParam);
Notes
- Base, IAP 등 모듈별 TypeKind 열거형은 서로 겹치지 않는 정수 범위를 사용하므로,
Stove_CreateParam()하나로 모든 모듈의 파라미터를 생성할 수 있어요. - 2000번대(결과/데이터 타입)는 호출자가 직접 생성하지 않으며, 콜백으로 전달되는 객체의
GetTypeKind()값으로만 나타나요. k_EStoveIAPTypeKind_StartPurchaseOutcome은 옛 이름PurchaseResult에서 이름이 바뀐 것이에요. 과거 연동을 옮기는 경우 참고해 주세요.
See Also
EStoveLogMethodCode
종류 열거형 · 모듈 Log · 버전 3.5.0
Description
IStoveResult::GetMethodCode() 로 조회하며, 로깅과 오류 라우팅에 사용해요.
모듈 블록 6000~6999 를 순차적으로 사용해요.
Declaration
typedef enum EStoveLogMethodCode
{
k_EStoveLogMethodCode_Invalid = -1,
k_EStoveLogMethodCode_SendLog = 6000,
k_EStoveLogMethodCode_Max = 0x7fffffff
} EStoveLogMethodCode;
Enum Values
| Code | Name | Description |
|---|---|---|
| -1 | k_EStoveLogMethodCode_Invalid | 사용하지 않아요 |
| 6000 | k_EStoveLogMethodCode_SendLog | Stove_SendLog 가 만든 결과예요. |
| 0x7fffffff | k_EStoveLogMethodCode_Max | 사용하지 않아요 |
Example
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetMethodCode(result) == k_EStoveLogMethodCode_SendLog)
{
// Stove_SendLog() 호출에 대한 결과입니다.
}
Notes
- 로그 기능은
Stove_SendLog()하나만 공개 API 로 제공해요. 초기화·종료는 SDK 가 대신해요. - 모듈별
EStoveLogResultCode는 삭제되었어요. 결과 코드는 EStoveResultCode, EStoveCommonResultCode 로 통합되었어요.
See Also
EStoveLogTypeKind
종류 열거형 · 모듈 Log · 버전 3.5.0
Description
Stove_CreateParam() 이 특정 파라미터 객체를 생성할 때, 그리고 IStoveTypeBase::GetTypeKind() 로 런타임 타입을 확인할 때 쓰예요. 정수 범위는 6000 ~ 6999 예요.
Declaration
typedef enum EStoveLogTypeKind
{
k_EStoveLogTypeKind_Invalid = -1,
k_EStoveLogTypeKind_SendLogParam = 6500,
k_EStoveLogTypeKind_Max = 0x7fffffff
} EStoveLogTypeKind;
Enum Values
| Code | Name | Description |
|---|---|---|
| -1 | k_EStoveLogTypeKind_Invalid | 사용하지 않아요 |
| 6500 | k_EStoveLogTypeKind_SendLogParam | 호출자가 Stove_CreateParam() 으로 생성하는 파라미터 타입이에요. IStoveSendLogParam 에 대응해요. |
| 0x7fffffff | k_EStoveLogTypeKind_Max | 사용하지 않아요 |
Example
IStoveSendLogParam* logParam = (IStoveSendLogParam*)Stove_CreateParam(k_EStoveLogTypeKind_SendLogParam);
Notes
- 로그 기능의 TypeKind 범위(6000 ~ 6999)는 다른 모듈의 TypeKind 범위와 겹치지 않아요.
- 현재 로그 기능이 정의하는 파라미터 타입은
k_EStoveLogTypeKind_SendLogParam하나뿐이에요.
See Also
EStoveOverlayMode
종류 열거형 · 모듈 Base · 버전 3.5.0
Description
베트남 연령등급 고지, 과몰입 방지 고지 등 규제/알림 오버레이의 표시 상태를 나타내는 값이에요.
IStoveVietnamAgeRatingInfo::GetOverlayMode(), IStoveVietnamOverimmersionInfo::GetOverlayMode() 로 조회해요.
Declaration
typedef enum EStoveOverlayMode
{
k_EStoveOverlayMode_Invalid = -1,
k_EStoveOverlayMode_Show = 0,
k_EStoveOverlayMode_Hide = 1,
k_EStoveOverlayMode_Expanded = 2,
k_EStoveOverlayMode_Max = 0x7fffffff
} EStoveOverlayMode;
Enum Values
| Code | Name | Description |
|---|---|---|
| -1 | k_EStoveOverlayMode_Invalid | 사용하지 않아요 |
| 0 | k_EStoveOverlayMode_Show | 오버레이를 표시해요 |
| 1 | k_EStoveOverlayMode_Hide | 오버레이를 숨겨요 |
| 2 | k_EStoveOverlayMode_Expanded | 오버레이를 확장된 형태로 표시해요 |
| 0x7fffffff | k_EStoveOverlayMode_Max | 사용하지 않아요 |
Example
void __cdecl OnVietnamAgeRatingNotificationCallback(const IStoveCallbackResult* callbackResult, const IStoveVietnamAgeRatingInfo* ageRatingInfo)
{
int32_t overlayMode = Stove_IStoveVietnamAgeRatingInfo_GetOverlayMode(ageRatingInfo);
if (overlayMode == k_EStoveOverlayMode_Show)
{
// 오버레이를 표시하는 로직을 구현해 주세요.
}
}
Notes
k_EStoveOverlayMode_Expanded는 베트남 과몰입 방지 고지(IStoveVietnamOverimmersionInfo)에서만 사용되는 값이에요. 연령등급 고지(IStoveVietnamAgeRatingInfo)에는 Show/Hide 만 전달돼요.- 옛 인터페이스에서는 값 이름에 밑줄이 없었어요(예:
k_EStoveOverlayModeInvalid). 현재 인터페이스는k_EStoveOverlayMode_Invalid처럼 타입명과 값명 사이에 밑줄이 들어가요.
Changelog
| Version | Change |
|---|---|
| 3.5.0 | 최초 제공 |
See Also
EStovePCBangMethodCode
종류 열거형 · 모듈 PCBang · 버전 3.5.0
Description
IStoveResult::GetMethodCode() 로 조회되는 값으로, 어떤 PC방 함수가 해당 결과를 생성했는지 식별해요. 로깅이나 오류 라우팅에 사용할 수 있어요.
모듈 블록 3000~3999 를 순차적으로 사용해요.
Declaration
typedef enum EStovePCBangMethodCode
{
k_EStovePCBangMethodCode_Invalid = -1,
k_EStovePCBangMethodCode_Login = 3000,
k_EStovePCBangMethodCode_Logout = 3001,
k_EStovePCBangMethodCode_CheckStatus = 3002,
k_EStovePCBangMethodCode_RefreshBenefit = 3003,
k_EStovePCBangMethodCode_Max = 0x7fffffff
} EStovePCBangMethodCode;
Enum Values
| Code | Name | Description |
|---|---|---|
| -1 | k_EStovePCBangMethodCode_Invalid | 사용하지 않아요 |
| 3000 | k_EStovePCBangMethodCode_Login | Stove_PCBangLogin 의 onUserLogin 콜백 결과예요. |
| 3001 | k_EStovePCBangMethodCode_Logout | Stove_PCBangLogout 의 결과예요. |
| 3002 | k_EStovePCBangMethodCode_CheckStatus | Stove_PCBangCheckStatus 의 결과예요. |
| 3003 | k_EStovePCBangMethodCode_RefreshBenefit | Stove_PCBangLogin 의 onRefreshBenefit 콜백 결과예요. |
| 0x7fffffff | k_EStovePCBangMethodCode_Max | 사용하지 않아요 |
Example
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetMethodCode(result) == k_EStovePCBangMethodCode_Login)
{
// Stove_PCBangLogin() 의 최초 로그인 결과입니다.
}
Notes
k_EStovePCBangMethodCode_RefreshBenefit은 Stove_PCBangLogin 의onRefreshBenefit콜백 결과에 대응하는 코드예요. 이 콜백은 로그인 성공 후 4분 주기로 반복 전달되며, 유료(Premium)·무료(Free) 상태 모두에서 계속 호출돼요.Login코드(최초 로그인, 1회성)와는 발생 시점·횟수가 달라요.
See Also
EStovePCBangPremium
종류 열거형 · 모듈 PCBang · 버전 3.5.0
Description
로그인한 사용자의 PC방 프리미엄(유료) 이용 상태를 나타내는 값이에요. IStovePCBangLoginOutcome::GetPremiumCheck(), IStovePCBangBenefitInfo::GetPremiumCheck(), IStovePCBangStatus::GetPremiumCheck() 가 이 값을 반환해요.
이 열거형에는 별도의 성공/실패 판정용 코드가 없어요. k_EStovePCBangPremium_Error 는 서버 오류·판단 불가 상태를 나타내는 값이며, 결과 성공 여부는 Stove_IStoveResult_GetResultCode() 값이 0인지로 별도 확인해요.
Declaration
typedef enum EStovePCBangPremium
{
k_EStovePCBangPremium_Error = -1,
k_EStovePCBangPremium_Premium = 1,
k_EStovePCBangPremium_Free = 2,
k_EStovePCBangPremium_FreeOther = 3,
k_EStovePCBangPremium_Max = 0x7fffffff
} EStovePCBangPremium;
Enum Values
| Code | Name | Description |
|---|---|---|
| -1 | k_EStovePCBangPremium_Error | 서버 오류 / 상태를 판단할 수 없음 |
| 1 | k_EStovePCBangPremium_Premium | 프리미엄(유료) PC방 혜택을 이용 가능한 상태예요. |
| 2 | k_EStovePCBangPremium_Free | 무료 이용 상태예요. |
| 3 | k_EStovePCBangPremium_FreeOther | 제휴사(타사)가 제공하는 무료 이용 상태예요. |
| 0x7fffffff | k_EStovePCBangPremium_Max | 사용하지 않아요 |
Example
void __cdecl OnUserLogin(const IStoveCallbackResult* callbackResult, const IStovePCBangLoginOutcome* loginOutcome)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == 0)
{
int32_t premium = Stove_IStovePCBangLoginOutcome_GetPremiumCheck(loginOutcome);
if (premium == k_EStovePCBangPremium_Premium)
{
// 프리미엄 혜택 로직을 구현해 주세요.
}
}
}
Notes
- 이 값은 IStovePCBangLoginOutcome, IStovePCBangBenefitInfo, IStovePCBangStatus 세 구조체가 공통으로 반환해요.
- PC방 혜택 갱신(Stove_PCBangLogin 의
onRefreshBenefit콜백)은 4분 주기로 반복 호출되며,Premium·Free상태 모두에서 계속 호출돼요. 갱신 응답이 정상적으로 도착했지만 그 값이FreeOther인 경우에는 반복이 멈춰요. 반면 네트워크 등의 이유로 갱신 요청 자체가 실패한 회차는 반복을 멈추지 않고 다음 주기에 다시 시도해요.
See Also
EStovePCBangTypeKind
종류 열거형 · 모듈 PCBang · 버전 3.5.0
Description
IStoveTypeBase::GetTypeKind() 로 조회되는 값으로, PCBang 비동기 콜백을 통해 전달되는 결과/데이터 객체의 런타임 타입을 식별하는 데 사용돼요.
값 범위는 3000 ~ 3999 로 예약되어 있어요.
Declaration
typedef enum EStovePCBangTypeKind
{
k_EStovePCBangTypeKind_Invalid = -1,
k_EStovePCBangTypeKind_StovePCBangLoginOutcome = 3000,
k_EStovePCBangTypeKind_StovePCBangBenefitInfo = 3001,
k_EStovePCBangTypeKind_StovePCBangStatus = 3002,
k_EStovePCBangTypeKind_Max = 0x7fffffff
} EStovePCBangTypeKind;
Enum Values
| Code | Name | Description |
|---|---|---|
| -1 | k_EStovePCBangTypeKind_Invalid | 사용하지 않아요 |
| 3000 | k_EStovePCBangTypeKind_StovePCBangLoginOutcome | IStovePCBangLoginOutcome 의 타입 값이에요. |
| 3001 | k_EStovePCBangTypeKind_StovePCBangBenefitInfo | IStovePCBangBenefitInfo 의 타입 값이에요. |
| 3002 | k_EStovePCBangTypeKind_StovePCBangStatus | IStovePCBangStatus 의 타입 값이에요. |
| 0x7fffffff | k_EStovePCBangTypeKind_Max | 사용하지 않아요 |
Example
void __cdecl OnUserLogin(const IStoveCallbackResult* callbackResult, const IStovePCBangLoginOutcome* loginOutcome)
{
if (Stove_IStoveTypeBase_GetTypeKind((const IStoveTypeBase*)loginOutcome) == k_EStovePCBangTypeKind_StovePCBangLoginOutcome)
{
// loginOutcome 을 IStovePCBangLoginOutcome 으로 사용합니다.
}
}
Notes
- 이 열거형에 포함된 값은 모두 PC방 기능이 콜백으로 전달하는 결과/데이터 타입이며, 호출자가 생성하는 입력 파라미터 타입은 없어요.
- 3000~3999 범위는 PC방 기능 전용으로 예약되어 있어 다른 모듈의 TypeKind 값과 겹치지 않아요.
See Also
EStoveProductTypeCode
종류 열거형 · 모듈 IAP · 버전 3.5.0
Description
IStoveProduct 의 ProductTypeCode 로 반환되는 상품 분류 코드예요.
Declaration
typedef enum EStoveProductTypeCode
{
k_EStoveProductTypeCode_None = 0,
k_EStoveProductTypeCode_IndiePackageGameItem = 1,
k_EStoveProductTypeCode_InGameItem = 2,
k_EStoveProductTypeCode_PackageItem = 3,
k_EStoveProductTypeCode_Max = 0x7fffffff
} EStoveProductTypeCode;
Enum Values
| Code | Name | Description |
|---|---|---|
| 0 | k_EStoveProductTypeCode_None | 분류 없음 |
| 1 | k_EStoveProductTypeCode_IndiePackageGameItem | 인디 패키지 게임 아이템 |
| 2 | k_EStoveProductTypeCode_InGameItem | 인게임 아이템 |
| 3 | k_EStoveProductTypeCode_PackageItem | 패키지 아이템 |
| 0x7fffffff | k_EStoveProductTypeCode_Max | 사용하지 않아요 |
Example
int32_t typeCode = Stove_IStoveProduct_GetProductTypeCode(product);
if (typeCode == k_EStoveProductTypeCode_InGameItem)
{
// 인게임 아이템 전용 로직을 구현해 주세요.
}
Notes
- IStoveProduct::ProductTypeCode 값을 해석할 때 사용해요.
See Also
EStovePurchaseLimitTypeCode
종류 열거형 · 모듈 IAP · 버전 3.5.0
Description
IStoveProduct 의 PurchaseLimitTypeCode 로 반환되며, PurchaseLimitCount 가 어느 범위(계정 단위 · 캐릭터 단위)로 적용되는지를 나타내요.
Declaration
typedef enum EStovePurchaseLimitTypeCode
{
k_EStovePurchaseLimitTypeCode_None = 0,
k_EStovePurchaseLimitTypeCode_Unlimited = 1,
k_EStovePurchaseLimitTypeCode_Member = 2,
k_EStovePurchaseLimitTypeCode_Character = 3,
k_EStovePurchaseLimitTypeCode_Max = 0x7fffffff
} EStovePurchaseLimitTypeCode;
Enum Values
| Code | Name | Description |
|---|---|---|
| 0 | k_EStovePurchaseLimitTypeCode_None | 정의된 제한 정책 없음 |
| 1 | k_EStovePurchaseLimitTypeCode_Unlimited | 무제한 구매 가능 |
| 2 | k_EStovePurchaseLimitTypeCode_Member | 계정(회원) 단위 제한 |
| 3 | k_EStovePurchaseLimitTypeCode_Character | 캐릭터 단위 제한 |
| 0x7fffffff | k_EStovePurchaseLimitTypeCode_Max | 사용하지 않아요 |
Example
int32_t limitType = Stove_IStoveProduct_GetPurchaseLimitTypeCode(product);
int32_t limitCount = Stove_IStoveProduct_GetPurchaseLimitCount(product);
Notes
- IStoveProduct::PurchaseLimitCount 를 해석할 때 이 값을 함께 사용해요.
See Also
EStovePurchaseOperation
종류 열거형 · 모듈 IAP · 버전 3.5.0
Description
IStovePurchaseParam 의 Operation 값으로 전달해, Stove_StartPurchase() 가 수동 URL 방식·Stove 웹뷰 방식·웹뷰+자동확정 방식 중 어느 흐름으로 동작할지 선택해요.
Declaration
typedef enum EStovePurchaseOperation
{
k_EStovePurchaseOperation_Default = 0,
k_EStovePurchaseOperation_WithWebView = 1,
k_EStovePurchaseOperation_WithWebViewAndConfirmResult = 2,
k_EStovePurchaseOperation_Max = 0x7fffffff
} EStovePurchaseOperation;
Enum Values
| Code | Name | Description |
|---|---|---|
| 0 | k_EStovePurchaseOperation_Default | Stove 웹뷰를 사용하지 않아요. 호출자가 구매 결과의 1회용 URL로 Stove 결제 페이지를 직접 열고, 결제 후 Stove_ConfirmPurchase() 를 호출해 구매를 확정해야 해요. |
| 1 | k_EStovePurchaseOperation_WithWebView | Stove 결제 페이지를 Stove 웹뷰 안에서 열어요. 결제 후에도 호출자가 Stove_ConfirmPurchase() 를 호출해야 구매가 확정돼요. |
| 2 | k_EStovePurchaseOperation_WithWebViewAndConfirmResult | Stove 결제 페이지를 Stove 웹뷰 안에서 열고, 결제가 성공하면 Stove_ConfirmPurchase() 를 SDK 가 자동으로 호출해 확정된 구매 결과까지 돌려줘요. |
| 0x7fffffff | k_EStovePurchaseOperation_Max | 사용하지 않아요 |
Example
IStovePurchaseParam* purchaseParam = (IStovePurchaseParam*)Stove_CreateParam(k_EStoveIAPTypeKind_PurchaseParam);
Stove_IStovePurchaseParam_SetOperation(purchaseParam, k_EStovePurchaseOperation_WithWebViewAndConfirmResult);
Notes
Default를 제외한 나머지 값을 쓸 때는 IStovePurchaseParam 이 상속하는WebView*필드(웹뷰 위치·크기)도 함께 채워야 해요.- 어느 필드가 결과에 채워지는지는 이 값에 따라 달라져요. 자세한 내용은 IStoveStartPurchaseOutcome 문서를 참고하세요.
See Also
EStovePurchaseProgress
종류 열거형 · 모듈 IAP · 버전 3.5.0
Description
IStoveStartPurchaseOutcome 의 PurchaseProgress 로 반환돼요.
Declaration
typedef enum EStovePurchaseProgress
{
k_EStovePurchaseProgress_None = 0,
k_EStovePurchaseProgress_NeedPaymentWindow = 1,
k_EStovePurchaseProgress_NotNeedPaymentWindow = 2,
k_EStovePurchaseProgress_Max = 0x7fffffff
} EStovePurchaseProgress;
Enum Values
| Code | Name | Description |
|---|---|---|
| 0 | k_EStovePurchaseProgress_None | 진행 상태 없음 |
| 1 | k_EStovePurchaseProgress_NeedPaymentWindow | 호출자가 결과의 1회용 결제 URL로 결제 창을 직접 열어야 해요. |
| 2 | k_EStovePurchaseProgress_NotNeedPaymentWindow | 결제 창을 열 필요가 없어요 — 무료 결제로 완료되었거나 웹뷰 기반 흐름이 이미 결제를 처리했어요. |
| 0x7fffffff | k_EStovePurchaseProgress_Max | 사용하지 않아요 |
Example
int32_t progress = Stove_IStoveStartPurchaseOutcome_GetPurchaseProgress(outcome);
if (progress == k_EStovePurchaseProgress_NeedPaymentWindow)
{
const wchar_t* paymentUrl = Stove_IStoveStartPurchaseOutcome_GetTempPaymentUrl(outcome);
// paymentUrl 로 결제 창을 열어 주세요.
}
Notes
NeedPaymentWindow일 때는 IStoveStartPurchaseOutcome::TempPaymentUrl 을 사용해 결제 창을 열고, 결제 후 Stove_ConfirmPurchase 로 구매를 확정해야 해요.
See Also
EStoveResultCode
종류 결과코드 · 모듈 Base · 버전 3.5.0
Description
IStoveResult::GetResultCode() 로 조회하는 값 중, 여러 모듈이 공유하는 전역 사전에 속한 300번대 코드예요. 백의 자리 숫자로 범주를 구분해요(3xx: Base, 4xx: webview/popup UI, 5xx: IAP 구매/페이로드). 단일 바이너리 구조에서는 모듈 간 코드 분리가 의미가 없어, 여러 모듈에서 같은 의미로 쓰이던 코드를 하나의 번호로 통합했어요. 어떤 모듈에서 발생한 코드인지는 GetMethodCode() 값(코드 / 1000 = 모듈 블록)으로 확인할 수 있어요.
모든 모듈이 공통으로 쓰는 결과 코드(0~299)는 EStoveCommonResultCode 를 참조하세요.
옛 인터페이스의 모듈별 결과코드 열거형(
EStoveBaseResultCode,EStoveIAPResultCode등)은 없어졌어요. 현재는 이 열거형(300~) 과EStoveCommonResultCode(0 ~ 299) 로 통합되었어요.
Declaration
typedef enum EStoveResultCode
{
k_EStoveResultCode_LanguageNotSet = 300,
// ... 이하 열거값 표 참조
k_EStoveResultCode_InvalidOrderProductInformation = 503,
k_EStoveResultCode_Max = 0x7fffffff
} EStoveResultCode;
Enum Values
3xx — Base 언어 / GDS / 런처 / 토큰 / IPC
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 300 | k_EStoveResultCode_LanguageNotSet | 표시 언어가 설정되지 않았어요(Stove_SetLanguage 로 언어 설정 후 재호출) | x | |
| 301 | k_EStoveResultCode_EmptyTranslatedString | 번역된 문자열이 비어 있어요 | x | |
| 302 | k_EStoveResultCode_NotFoundRequiredInformation | 필요한 정보를 찾지 못했어요 | x | |
| 303 | k_EStoveResultCode_InvalidGdsInfo | GDS(국가/규제) 정보가 유효하지 않아요 | x | |
| 304 | k_EStoveResultCode_NeedStoveLauncher | Stove 런처가 필요하지만 실행되어 있지 않아요 | O | 게임이 스토브 PC 클라이언트를 통해 실행되지 않아 종료됩니다.클라이언트에서 다시 게임을 실행해주세요.클라이언트 미설치 시 스토브 홈페이지에서 설치해주세요.[확인] |
| 305 | k_EStoveResultCode_LauncherFailedCreateRequired | 필요한 런처 리소스 생성에 실패했어요 | x | |
| 306 | k_EStoveResultCode_RenewTokenMaxRetryCountExceeded | 토큰 갱신이 최대 재시도 횟수를 초과했어요 | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
| 307 | k_EStoveResultCode_IpcConnectFailed | 런처와의 IPC 연결에 실패했어요 | O | 게임이 스토브 PC 클라이언트를 통해 실행되지 않아 종료됩니다.클라이언트에서 다시 게임을 실행해주세요.클라이언트 미설치 시 스토브 홈페이지에서 설치해주세요.[확인] |
| 308 | k_EStoveResultCode_IpcAesKeyNotReceived | IPC 로 AES 키를 받지 못했어요 | O | 게임이 스토브 PC 클라이언트를 통해 실행되지 않아 종료됩니다.클라이언트에서 다시 게임을 실행해주세요.클라이언트 미설치 시 스토브 홈페이지에서 설치해주세요.[확인] |
| 309 | k_EStoveResultCode_IpcTimeout | 런처와의 IPC 통신이 시간 초과되었어요 | O | 게임이 스토브 PC 클라이언트를 통해 실행되지 않아 종료됩니다.클라이언트에서 다시 게임을 실행해주세요.클라이언트 미설치 시 스토브 홈페이지에서 설치해주세요.[확인] |
아래 코드를 받으면 반드시 게임을 종료해야 해요. 정상 진행이 불가능한 상태예요.
304k_EStoveResultCode_NeedStoveLauncher— 스토브 PC 클라이언트를 통해 실행되지 않아 재실행이 필요해요307k_EStoveResultCode_IpcConnectFailed— 런처와의 연결에 실패해 재실행이 필요해요308k_EStoveResultCode_IpcAesKeyNotReceived— 런처와의 통신 준비에 실패해 재실행이 필요해요309k_EStoveResultCode_IpcTimeout— 런처와의 통신이 시간 초과되어 재실행이 필요해요
4xx — (예약, 사용하지 않음)
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| — | 400 ~ 499 | webview/popup UI 코드는 EStoveCommonResultCode 60~68 로 이동했어요 | — | — |
5xx — IAP 구매 / 페이로드
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| — | 501, 502 | EStoveCommonResultCode 80, 81 로 이동했어요 | — | — |
| 503 | k_EStoveResultCode_InvalidOrderProductInformation | 주문/상품 정보가 유효하지 않아요 | O | 결제 정보가 유효하지 않아 결제를 진행할 수 없습니다. 다시 시도해 주세요. [확인] |
| 0x7fffffff | k_EStoveResultCode_Max | 사용하지 않아요 | — | — |
Example
IStoveResult* result = Stove_SetGameProfile(profileParam);
if (Stove_IStoveResult_GetResultCode(result) == k_EStoveResultCode_LanguageNotSet)
{
// Stove_SetLanguage() 를 먼저 호출하는 로직을 구현해 주세요.
}
Notes
- 옛 인터페이스의
EStoveBaseResultCode(80번대)를 대체해요. 단일 바이너리 통합으로 모듈별 결과코드가 이 열거형(300~)과 EStoveCommonResultCode(0 ~ 299)로 재편되었어요. - 401 ~ 499, 501, 502 는 값 자체가 예약되어 있을 뿐 이 열거형에는 존재하지 않아요. 실제 코드는
EStoveCommonResultCode60 ~ 68(webview/popup UI), 80 ~ 81(IAP 파라미터 검증)에서 찾을 수 있어요.
Changelog
| Version | Change |
|---|---|
| 3.5.0 | 최초 제공 (옛 EStoveBaseResultCode 대체) |
See Also
EStoveTermsOperation
종류 열거형 · 모듈 IAP · 버전 3.5.0
Description
IStoveFetchTermsAgreementParam 의 Operation 값으로 전달해, Stove_FetchTermsAgreement() 가 약관 페이지를 어떻게 노출할지 선택해요.
Declaration
typedef enum EStoveTermsOperation
{
k_EStoveTermsOperation_Default = 0,
k_EStoveTermsOperation_WithWebView = 1,
k_EStoveTermsOperation_Max = 0x7fffffff
} EStoveTermsOperation;
Enum Values
| Code | Name | Description |
|---|---|---|
| 0 | k_EStoveTermsOperation_Default | Stove 웹뷰를 사용하지 않아요. 호출자가 결과로 받은 1회용 URL로 약관 페이지를 직접 열어요. |
| 1 | k_EStoveTermsOperation_WithWebView | 약관 동의 페이지를 Stove 웹뷰 안에서 열어요. |
| 0x7fffffff | k_EStoveTermsOperation_Max | 사용하지 않아요 |
Example
IStoveFetchTermsAgreementParam* param = (IStoveFetchTermsAgreementParam*)Stove_CreateParam(k_EStoveIAPTypeKind_FetchTermsAgreementParam);
Stove_IStoveFetchTermsAgreementParam_SetOperation(param, k_EStoveTermsOperation_WithWebView);
Notes
WithWebView를 쓸 때는 IStoveFetchTermsAgreementParam 이 상속하는WebView*필드(웹뷰 위치·크기)도 함께 채워야 해요.- 이미 최신 약관에 동의한 사용자라면 이 값과 무관하게 IStoveTermsAgreementOutcome 의
IsAgreed가true로,Url이 빈 문자열로 반환돼요.
See Also
EStoveViewMethodCode
종류 열거형 · 모듈 View · 버전 3.5.0
Description
EStoveViewMethodCode 는 IStoveResult 를 만든 팝업 API 가 무엇인지 식별하는 값이에요. IStoveResult::GetMethodCode()(Stove_IStoveResult_GetMethodCode()) 로 조회할 수 있으며, 로그 기록이나 오류 처리 분기에 사용해요.
이 열거형의 값 범위는 1000 ~ 1999 (모듈 블록) 이며, 팝업 API 들이 연속해서 번호를 써요.
Declaration
typedef enum EStoveViewMethodCode
{
k_EStoveViewMethodCode_Invalid = -1,
k_EStoveViewMethodCode_AutoPopup = 1000,
// ... 이하 열거값 표 참조
k_EStoveViewMethodCode_SetPopupDisallowed = 1005,
k_EStoveViewMethodCode_Max = 0x7fffffff
} EStoveViewMethodCode;
Enum Values
| Code | Name | Description |
|---|---|---|
| -1 | k_EStoveViewMethodCode_Invalid | 사용하지 않아요 |
| 1000 | k_EStoveViewMethodCode_AutoPopup | Stove_AutoPopup |
| 1001 | k_EStoveViewMethodCode_ManualPopup | Stove_ManualPopup |
| 1002 | k_EStoveViewMethodCode_NewsPopup | Stove_NewsPopup |
| 1003 | k_EStoveViewMethodCode_CouponPopup | Stove_CouponPopup |
| 1004 | k_EStoveViewMethodCode_VerifyIdentificationPopup | Stove_VerifyIdentificationPopup |
| 1005 | k_EStoveViewMethodCode_SetPopupDisallowed | Stove_SetPopupDisallowed |
| 0x7fffffff | k_EStoveViewMethodCode_Max | 사용하지 않아요 |
Example
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetMethodCode(result) == k_EStoveViewMethodCode_ManualPopup)
{
// Stove_ManualPopup() 호출의 결과인 경우 로직을 구현해 주세요.
}
Notes
- 값 범위(
1000~1999)는 다른 모듈의 MethodCode 값과 겹치지 않아요. Stove_CloseAllPopups()는 View 뿐 아니라 IAP 팝업까지 함께 닫는 BaseSDK 소속 통합 함수이며, 이 열거형에 대응하는 값을 갖지 않아요.- 같은 팝업이라도 구 인터페이스와 값이 달라요. 구 인터페이스(
View_AutoPopup등)는81·83·85·87·91·160을 그대로 돌려주고, 신규 인터페이스는 이 열거형의1000번대 값을 돌려줘요. 두 벌을 함께 쓰는 동안에는 로그 집계 기준을 벌마다 나누어 두세요.
Changelog
| Version | Change |
|---|---|
| 3.5.0 | 최초 제공 |
See Also
- Stove_AutoPopup
- Stove_ManualPopup
- Stove_NewsPopup
- Stove_CouponPopup
- Stove_VerifyIdentificationPopup
- Stove_SetPopupDisallowed
EStoveViewTypeKind
종류 열거형 · 모듈 View · 버전 3.5.0
Description
EStoveViewTypeKind 는 팝업 기능이 다루는 IStoveTypeBase 계열 객체의 구체적인 타입을 식별하는 값이에요. Stove_CreateParam() 으로 특정 파라미터 객체를 요청할 때 넘기는 값이며, IStoveTypeBase::GetTypeKind()(Stove_IStoveTypeBase_GetTypeKind()) 로 런타임에 객체의 실제 타입을 확인할 때도 이 값을 써요.
이 열거형의 값 범위는 1000 ~ 1999 예요. 파라미터 타입은 1500대, 콜백으로 전달되는 페이로드 타입은 1504 하나예요. 값 범위가 다른 모듈의 TypeKind 열거형과 겹치지 않으므로 Stove_CreateParam() 하나로 모든 모듈의 파라미터를 생성할 수 있어요.
Declaration
typedef enum EStoveViewTypeKind
{
k_EStoveViewTypeKind_Invalid = -1,
k_EStoveViewTypeKind_SetPopupDisallowedParam = 1500,
// ... 이하 열거값 표 참조
k_EStoveViewTypeKind_VerifyIdentificationPopupDestroyInfo = 1504,
k_EStoveViewTypeKind_Max = 0x7fffffff
} EStoveViewTypeKind;
Enum Values
Parameter types (호출자가 Stove_CreateParam() 으로 생성)
| Code | Name | Description |
|---|---|---|
| -1 | k_EStoveViewTypeKind_Invalid | 사용하지 않아요 |
| 1500 | k_EStoveViewTypeKind_SetPopupDisallowedParam | IStoveSetPopupDisallowedParam |
| 1501 | k_EStoveViewTypeKind_PopupParam | IStovePopupParam |
| 1502 | k_EStoveViewTypeKind_ManualPopupParam | IStoveManualPopupParam |
| 1503 | k_EStoveViewTypeKind_VerifyIdentificationPopupParam | IStoveVerifyIdentificationPopupParam |
Callback payload types (SDK 가 생성해 콜백으로 전달)
| Code | Name | Description |
|---|---|---|
| 1504 | k_EStoveViewTypeKind_VerifyIdentificationPopupDestroyInfo | IStoveVerifyIdentificationPopupDestroyInfo |
| — | 1505 ~ 0x7ffffffe | 사용하지 않아요 (예약 구간) |
| 0x7fffffff | k_EStoveViewTypeKind_Max | 사용하지 않아요 |
Example
IStovePopupParam* param =
(IStovePopupParam*)Stove_CreateParam(k_EStoveViewTypeKind_PopupParam);
// param 사용 후
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param);
Notes
- 파라미터 타입(
1500~1503)은Stove_CreateParam()인자로 사용해요. 콜백 페이로드 타입(1504)은 SDK 가 만들어 전달하므로 직접 생성하지 않아요. - 값 범위(
1000~1999)는 다른 모듈의EStove<Module>TypeKind값과 겹치지 않아요.
Changelog
| Version | Change |
|---|---|
| 3.5.0 | 최초 제공 |
See Also
EStoveWebViewMode
종류 열거형 · 모듈 Base · 버전 3.5.0
Description
View SDK 와 IAP SDK 에서 웹뷰를 외부 팝업(시스템 기본 브라우저)으로 열지, 내부 팝업(SDK 내장 웹뷰)으로 열지를 결정하는 값이에요.
Declaration
typedef enum EStoveWebViewMode
{
k_EStoveWebViewMode_Invalid = -1,
k_EStoveWebViewMode_External = 0,
k_EStoveWebViewMode_Internal = 1,
k_EStoveWebViewMode_Max = 0x7fffffff
} EStoveWebViewMode;
Enum Values
| Code | Name | Description |
|---|---|---|
| -1 | k_EStoveWebViewMode_Invalid | 사용하지 않아요 |
| 0 | k_EStoveWebViewMode_External | 시스템 기본 브라우저에서 열어요 |
| 1 | k_EStoveWebViewMode_Internal | SDK 내장 웹뷰에서 열어요 |
| 0x7fffffff | k_EStoveWebViewMode_Max | 사용하지 않아요 |
Example
int32_t webViewMode = k_EStoveWebViewMode_Internal;
Notes
- View SDK, IAP SDK 의 팝업 표시 방식을 지정할 때 사용하는 값이에요.
k_EStoveWebViewMode_Internal은 "내부 웹뷰를 쓴다"는 도메인 의미의 값으로, SDK 내부 전용(Internal-only) 값이 아니에요.- 옛 인터페이스에서는 값 이름에 밑줄이 없었어요(예:
k_EStoveWebViewModeInvalid). 현재 인터페이스는k_EStoveWebViewMode_Invalid처럼 타입명과 값명 사이에 밑줄이 들어가요.
Changelog
| Version | Change |
|---|---|
| 3.5.0 | 최초 제공 |
See Also
- 없음
IStoveAccessToken
종류 구조체 · 모듈 Base · 버전 3.5.0
Description
Stove_AccessTokenRenewed() 를 호출했을 때 AccessToken 이 갱신되는 시점에 콜백으로 전달되는 토큰 구조체예요.
SDK 가 만들어 콜백 인자로만 전달하며, 호출자는 해제하지 않아요.
Declaration
typedef struct IStoveAccessToken IStoveAccessToken;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
AccessToken | const wchar_t* | 읽기 | Stove_IStoveAccessToken_GetAccessToken() | Stove AccessToken 값이에요. |
ExpireIn | int32_t | 읽기 | Stove_IStoveAccessToken_GetExpireIn() | Stove AccessToken 의 남은 유효 시간(초)예요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK — 콜백 인자로만 전달되며 콜백이 끝나면 무효처리돼요. 호출자는 Destroy() 를 호출하지 않아요. |
Example
void __cdecl OnAccessTokenRenewedCallback(const IStoveCallbackResult* callbackResult, const IStoveAccessToken* token)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == k_EStoveCommonResultCode_Success)
{
const wchar_t* accessToken = Stove_IStoveAccessToken_GetAccessToken(token);
int32_t expireIn = Stove_IStoveAccessToken_GetExpireIn(token);
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
// token 은 Destroy() 를 호출하지 않습니다.
}
Notes
- 이 구조체는
Stove_AccessTokenRenewed()로 등록한 콜백을 통해서만 받아요. 현재 유효한 토큰을 즉시 조회하려면 Stove_GetAccessToken 을 사용해요. - SDK 는 내부적으로 토큰을 자동 갱신하며, 갱신이 필요한 시점에 작업을 수행하려는 경우에만 이 콜백을 사용해요.
See Also
IStoveCallbackResult
종류 구조체 · 모듈 Base · 버전 3.5.0
Description
비동기 콜백에 전달되는 결과예요. IStoveResult 를 감싸고, 부가적인 오류 정보와 호출 시 전달한 userData 포인터를 함께 담아요.
Stove_RestartAppIfNecessary(), Stove_AccessTokenRenewed() 등 콜백 기반 비동기 API 의 첫 번째 콜백 인자로 전달돼요. 이 객체와 내부 포인터의 수명은 콜백 호출 동안으로 한정돼요. SDK 가 만들어 콜백 인자로만 전달하며, 호출자는 해제하지 않아요.
콜백이 끝나면 이 객체와
GetResult()로 얻은IStoveResult*는 모두 무효처리돼요.Destroy()를 호출하지 않아요.
Declaration
typedef struct IStoveCallbackResult IStoveCallbackResult;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
Result | IStoveResult* | 읽기 | Stove_IStoveCallbackResult_GetResult() | 내부 결과 객체예요. 콜백 호출 동안에만 유효해요. |
ErrorMessage | const wchar_t* | 읽기 | Stove_IStoveCallbackResult_GetErrorMessage() | 오류가 발생한 이유를 설명하는 상세 메시지예요. |
ExternalError | int32_t | 읽기 | Stove_IStoveCallbackResult_GetExternalError() | 외부 오류 값이에요(HTTP 오류 코드 또는 API 결과 코드). |
UserData | void* | 읽기 | Stove_IStoveCallbackResult_GetUserData() | 호출자가 비동기 API 호출 시 전달한 userData 포인터예요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK — 콜백 인자로만 전달되며 콜백이 끝나면 무효처리돼요. 호출자는 Destroy() 를 호출하지 않아요. |
Example
void __cdecl OnAccessTokenRenewedCallback(const IStoveCallbackResult* callbackResult, const IStoveAccessToken* token)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == k_EStoveCommonResultCode_Success)
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
// callbackResult, result, token 은 Destroy() 를 호출하지 않습니다.
}
Notes
- SDK 의 비동기 콜백(
OnRestartAppIfNecessaryCallback,OnAccessTokenRenewedCallback,OnOverImmersionNotificationCallback,OnShutdownNotificationCallback,OnVietnamAgeRatingNotificationCallback,OnVietnamOverimmersionNotificationCallback,OnOpenExternalUrlCallback)의 첫 번째 인자로 전달돼요. - 콜백은
Stove_RunCallback()(또는Stove_RunCallbackWithTimeout())을 호출한 스레드에서 실행돼요.
See Also
IStoveChargeInfo
종류 구조체 · 모듈 IAP · 버전 3.5.0
Description
한 번의 구매에 사용된 결제 수단(쿠폰, 스토브 캐시, 포인트, PG 등) 하나를 나타내요. IStoveStartPurchaseOutcome 과 IStoveConfirmPurchaseOutcome 양쪽에 배열 형태로 담겨 전달돼요.
SDK 가 채워서 콜백으로 전달하는 데이터형이에요. 호출자가 직접 만들지 않아요.
콜백으로 전달되는 배열과 각 항목은 SDK 소유이며 콜백 호출이 끝나면 더 이상 유효하지 않아요.
Destroy()를 호출하지 말고, 보관이 필요한 값은 콜백 안에서 복사해 두어야 해요.
Declaration
typedef struct IStoveChargeInfo IStoveChargeInfo;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
ChargeDeductVal | double | 읽기 | Stove_IStoveChargeInfo_GetChargeDeductVal() | 결제 시점에 실제로 차감된 금액 (결제 단위 기준) |
ChargeDisplayDeductVal | double | 읽기 | Stove_IStoveChargeInfo_GetChargeDisplayDeductVal() | 차감 금액의 캐시 환산 표시 값 |
ChargeType | int32_t | 읽기 | Stove_IStoveChargeInfo_GetChargeType() | 결제 수단 코드(charge_type, Int32). 2: 쿠폰, 98: 스토브 캐시, 99: 포인트, 그 외: PG(결제대행사) 결제 수단(서버에서 추가될 수 있음). 2/98/99 만 고정값이며 나머지는 서버가 정해요. |
ChargeTypeName | const wchar_t* | 읽기 | Stove_IStoveChargeInfo_GetChargeTypeName() | 현지화된 결제 수단 이름 |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지 — 콜백이 끝나면 무효) |
Example
void __cdecl OnConfirmPurchaseCallback(const IStoveCallbackResult* callbackResult, const IStoveConfirmPurchaseOutcome* outcome)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == 0 && Stove_IStoveConfirmPurchaseOutcome_IsConfirmed(outcome))
{
uint32_t count = Stove_IStoveConfirmPurchaseOutcome_GetChargeInfoCount(outcome);
for (uint32_t i = 0; i < count; ++i)
{
const IStoveChargeInfo* chargeInfo = Stove_IStoveConfirmPurchaseOutcome_GetChargeInfoAt(outcome, i);
double deductVal = Stove_IStoveChargeInfo_GetChargeDeductVal(chargeInfo);
const wchar_t* typeName = Stove_IStoveChargeInfo_GetChargeTypeName(chargeInfo);
// 필요한 값만 복사해서 보관해 주세요.
}
// outcome 과 그 안의 항목은 이 콜백이 끝나면 무효처리됩니다. Destroy() 를 호출하지 마십시오.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Notes
- IStoveStartPurchaseOutcome 의
ChargeInfoAt()과 IStoveConfirmPurchaseOutcome 의ChargeInfoAt()양쪽에서 전달돼요. - 한 번의 구매에 여러 결제 수단이 함께 사용된 경우, 배열에 결제 수단별로 항목이 나뉘어 담겨요.
See Also
IStoveConfirmPurchaseOutcome
종류 구조체 · 모듈 IAP · 버전 3.5.0
Description
Stove_ConfirmPurchase 호출 결과를 나타내요. OnConfirmPurchaseCallback 콜백에 전달돼요. 예전에는 확정 여부 플래그와 상품/결제 정보 배열이 콜백 인자로 각각 개별 전달되었으나, 지금은 이 구조체 하나로 묶여 전달돼요.
SDK 가 채워서 콜백으로 전달하는 데이터형이에요. 호출자가 직접 만들지 않아요.
PurchasedProductAt()/ChargeInfoAt()으로 얻는 항목은 모두 SDK 소유이며 콜백 호출이 끝나면 더 이상 유효하지 않아요.Destroy()를 호출하지 말고, 보관이 필요한 값은 콜백 안에서 복사해 두어야 해요.
Declaration
typedef struct IStoveConfirmPurchaseOutcome IStoveConfirmPurchaseOutcome;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
IsConfirmed | bool | 읽기 | Stove_IStoveConfirmPurchaseOutcome_IsConfirmed() | 구매가 성공적으로 확정되었는지 여부 |
PurchasedProductCount | uint32_t | 읽기 | Stove_IStoveConfirmPurchaseOutcome_GetPurchasedProductCount() | 구매 확정된 상품 항목 수 |
PurchasedProductAt(index) | const IStovePurchasedProduct* | 읽기 | Stove_IStoveConfirmPurchaseOutcome_GetPurchasedProductAt() | index(0부터 시작) 위치의 구매 상품 항목. index >= PurchasedProductCount 이면 nullptr 을 반환해요. |
ChargeInfoCount | uint32_t | 읽기 | Stove_IStoveConfirmPurchaseOutcome_GetChargeInfoCount() | charge-info 항목 수 |
ChargeInfoAt(index) | const IStoveChargeInfo* | 읽기 | Stove_IStoveConfirmPurchaseOutcome_GetChargeInfoAt() | index(0부터 시작) 위치의 charge-info 항목. index >= ChargeInfoCount 이면 nullptr 을 반환해요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지 — 콜백이 끝나면 무효) |
Example
void __cdecl OnConfirmPurchaseCallback(const IStoveCallbackResult* callbackResult, const IStoveConfirmPurchaseOutcome* outcome)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == 0 && Stove_IStoveConfirmPurchaseOutcome_IsConfirmed(outcome))
{
uint32_t productCount = Stove_IStoveConfirmPurchaseOutcome_GetPurchasedProductCount(outcome);
for (uint32_t i = 0; i < productCount; ++i)
{
const IStovePurchasedProduct* product = Stove_IStoveConfirmPurchaseOutcome_GetPurchasedProductAt(outcome, i);
// 아이템 지급 로직을 구현해 주세요. TxnDetailNo 기준으로 중복 지급을 방지해 주세요.
}
// outcome 과 그 안의 항목은 이 콜백이 끝나면 무효처리됩니다. Destroy() 를 호출하지 마십시오.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Notes
- Stove_ConfirmPurchase 의 출력으로만 전달돼요.
IsConfirmed가false이면 상품/결제 정보 배열이 비어 있을 수 있어요.
See Also
IStoveConfirmPurchaseParam
종류 구조체 · 모듈 IAP · 버전 3.5.0
Description
Stove_ConfirmPurchase 를 호출할 때 전달하는 입력 파라미터예요. IStoveStartPurchaseOutcome 에서 받은 트랜잭션 마스터 번호로 구매를 확정할 때 사용해요.
Stove_CreateParam(k_EStoveIAPTypeKind_ConfirmPurchaseParam) 으로 생성하고, setter 로 값을 채운 뒤 호출이 끝나면 Destroy() 로 해제해야 해요.
Declaration
typedef struct IStoveConfirmPurchaseParam IStoveConfirmPurchaseParam;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Required | Accessor | Description |
|---|---|---|---|---|---|
TxnMasterNo | int64_t | 읽기·쓰기 | 예 | Stove_IStoveConfirmPurchaseParam_GetTxnMasterNo() / Stove_IStoveConfirmPurchaseParam_SetTxnMasterNo() | IStoveStartPurchaseOutcome 에서 받은 트랜잭션 마스터 번호 |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 호출자 (Stove_CreateParam(k_EStoveIAPTypeKind_ConfirmPurchaseParam)) |
| 해제 책임 | 호출자 (Destroy() 필수) |
Example
IStoveConfirmPurchaseParam* confirmParam = (IStoveConfirmPurchaseParam*)Stove_CreateParam(k_EStoveIAPTypeKind_ConfirmPurchaseParam);
Stove_IStoveConfirmPurchaseParam_SetTxnMasterNo(confirmParam, txnMasterNo);
Stove_ConfirmPurchase(confirmParam, OnConfirmPurchaseCallback, NULL);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)confirmParam);
Notes
TxnMasterNo는 Stove_StartPurchase 의 결과인 IStoveStartPurchaseOutcome 의TxnMasterNo값을 그대로 사용해 주세요.Operation == Default로 시작한 구매는 결제 창에서 결제를 마친 뒤 반드시 이 API 로 구매를 확정해야 해요.
See Also
IStoveFetchProductsParam
종류 구조체 · 모듈 IAP · 버전 3.5.0
Description
Stove_FetchProducts 를 호출할 때 전달하는 입력 파라미터예요. 조회할 카테고리와 페이지 범위를 지정해요.
Stove_CreateParam(k_EStoveIAPTypeKind_FetchProductsParam) 으로 생성하고, setter 로 값을 채운 뒤 호출이 끝나면 Destroy() 로 해제해야 해요.
Declaration
typedef struct IStoveFetchProductsParam IStoveFetchProductsParam;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Required | Accessor | Description |
|---|---|---|---|---|---|
CategoryId | const wchar_t* | 읽기·쓰기 | 아니오 | Stove_IStoveFetchProductsParam_GetCategoryId() / Stove_IStoveFetchProductsParam_SetCategoryId() | 카테고리 ID 필터. 비워 두면 모든 카테고리의 상품을 조회해요. |
PageIndex | uint32_t | 읽기·쓰기 | 예 | Stove_IStoveFetchProductsParam_GetPageIndex() / Stove_IStoveFetchProductsParam_SetPageIndex() | 페이지 번호(1부터 시작). 서버에 전달되는 page_no 값과 일치해요. |
PageSize | uint32_t | 읽기·쓰기 | 예 | Stove_IStoveFetchProductsParam_GetPageSize() / Stove_IStoveFetchProductsParam_SetPageSize() | 페이지당 상품 수 |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 호출자 (Stove_CreateParam(k_EStoveIAPTypeKind_FetchProductsParam)) |
| 해제 책임 | 호출자 (Destroy() 필수) |
Example
IStoveFetchProductsParam* param = (IStoveFetchProductsParam*)Stove_CreateParam(k_EStoveIAPTypeKind_FetchProductsParam);
Stove_IStoveFetchProductsParam_SetCategoryId(param, L"");
Stove_IStoveFetchProductsParam_SetPageIndex(param, 1);
Stove_IStoveFetchProductsParam_SetPageSize(param, 20);
Stove_FetchProducts(param, OnFetchProductsCallback, NULL);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param);
Notes
CategoryId를 비워 두면 전체 카테고리의 상품을 조회해요. 특정 카테고리만 조회하려면 IStoveShopCategory 의CategoryId값을 지정해 주세요.
See Also
IStoveFetchTermsAgreementParam
종류 구조체 · 모듈 IAP · 버전 3.5.0
Description
Stove_FetchTermsAgreement 를 호출할 때 전달하는 입력 파라미터예요. IStoveWebViewLayoutParam 을 상속하며, WebView* 필드는 모두 Operation 이 Default 가 아닐 때만 적용돼요.
Stove_CreateParam(k_EStoveIAPTypeKind_FetchTermsAgreementParam) 으로 생성하고, setter 로 값을 채운 뒤 호출이 끝나면 Destroy() 로 해제해야 해요.
Declaration
typedef struct IStoveFetchTermsAgreementParam IStoveFetchTermsAgreementParam;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Required | Accessor | Description |
|---|---|---|---|---|---|
Operation | EStoveTermsOperation | 읽기·쓰기 | 예 | Stove_IStoveFetchTermsAgreementParam_GetOperation() / Stove_IStoveFetchTermsAgreementParam_SetOperation() | 동작 방식 선택자 |
WebViewMode | EStoveWebViewMode | 읽기·쓰기 | 아니오 | Stove_IStoveFetchTermsAgreementParam_GetWebViewMode() / Stove_IStoveFetchTermsAgreementParam_SetWebViewMode() | 웹뷰 표시 모드 (외부 브라우저 / SDK 내장 웹뷰). Operation != Default 일 때만 적용돼요. IStoveWebViewLayoutParam 상속 멤버예요. |
WebViewPosX | int32_t | 읽기·쓰기 | 아니오 | Stove_IStoveFetchTermsAgreementParam_GetWebViewPosX() / Stove_IStoveFetchTermsAgreementParam_SetWebViewPosX() | 웹뷰 x 좌표 (픽셀). Operation != Default 일 때만 적용돼요. IStoveWebViewLayoutParam 상속 멤버예요. |
WebViewPosY | int32_t | 읽기·쓰기 | 아니오 | Stove_IStoveFetchTermsAgreementParam_GetWebViewPosY() / Stove_IStoveFetchTermsAgreementParam_SetWebViewPosY() | 웹뷰 y 좌표 (픽셀). Operation != Default 일 때만 적용돼요. IStoveWebViewLayoutParam 상속 멤버예요. |
WebViewWidth | int32_t | 읽기·쓰기 | 아니오 | Stove_IStoveFetchTermsAgreementParam_GetWebViewWidth() / Stove_IStoveFetchTermsAgreementParam_SetWebViewWidth() | 웹뷰 너비 (픽셀). Operation != Default 일 때만 적용돼요. IStoveWebViewLayoutParam 상속 멤버예요. |
WebViewHeight | int32_t | 읽기·쓰기 | 아니오 | Stove_IStoveFetchTermsAgreementParam_GetWebViewHeight() / Stove_IStoveFetchTermsAgreementParam_SetWebViewHeight() | 웹뷰 높이 (픽셀). Operation != Default 일 때만 적용돼요. IStoveWebViewLayoutParam 상속 멤버예요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 호출자 (Stove_CreateParam(k_EStoveIAPTypeKind_FetchTermsAgreementParam)) |
| 해제 책임 | 호출자 (Destroy() 필수) |
Example
IStoveFetchTermsAgreementParam* param = (IStoveFetchTermsAgreementParam*)Stove_CreateParam(k_EStoveIAPTypeKind_FetchTermsAgreementParam);
Stove_IStoveFetchTermsAgreementParam_SetOperation(param, k_EStoveTermsOperation_WithWebView);
Stove_IStoveFetchTermsAgreementParam_SetWebViewMode(param, k_EStoveWebViewMode_Internal);
Stove_IStoveFetchTermsAgreementParam_SetWebViewWidth(param, 480);
Stove_IStoveFetchTermsAgreementParam_SetWebViewHeight(param, 640);
Stove_FetchTermsAgreement(param, OnFetchTermsAgreementCallback, NULL, NULL, NULL);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param);
Notes
Operation이Default이면WebView*필드는 무시돼요.
See Also
IStoveGds
종류 구조체 · 모듈 Base · 버전 3.5.0
Description
Stove_GetGds() 호출 시 전달되는 국가/규제/시간대/언어 정보 구조체예요.
로그인한 사용자의 IP 기반 국가 코드를 기본으로 제공하며, IP 로 국가를 판별할 수 없을 때는 기본 국가 코드로 대체돼요(IsDefault 로 구분). SDK 가 Stove_GetGds() 의 out 파라미터로 만들어 돌려주며, 호출자가 사용 후 Destroy() 로 해제해요.
Declaration
typedef struct IStoveGds IStoveGds;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
IsDefault | bool | 읽기 | Stove_IStoveGds_IsDefault() | 사용자의 IP 로 국가 코드를 판별할 수 없어 기본 국가 코드를 사용했는지 여부예요. IP 로 판별된 경우 false 이에요. |
Nation | const wchar_t* | 읽기 | Stove_IStoveGds_GetNation() | 로그인한 사용자의 IP 로 판별한 국가 코드예요(ISO 3166-1 ALPHA-2). |
Regulation | const wchar_t* | 읽기 | Stove_IStoveGds_GetRegulation() | 국가 코드에 따라 적용되는 규제 이름이에요(예: GDPR). |
Timezone | const wchar_t* | 읽기 | Stove_IStoveGds_GetTimezone() | 로그인한 사용자의 시간대예요(IANA Time Zone Database ID, 예: L"Asia/Seoul"). |
UtcOffset | int32_t | 읽기 | Stove_IStoveGds_GetUtcOffset() | 사용자 시간대의 UTC 오프셋(분)이에요. |
Lang | const wchar_t* | 읽기 | Stove_IStoveGds_GetLang() | 로그인한 사용자의 언어예요(ISO 639-1 ALPHA-2). 예외: 중국어는 zh / zh-tw, 인도네시아어는 "in" 을 사용해요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK (Stove_GetGds() 의 out 파라미터로 전달) |
| 해제 책임 | 호출자 (Destroy() 필수) |
Example
IStoveGds* gds = NULL;
IStoveResult* result = Stove_GetGds(&gds);
if (Stove_IStoveResult_GetResultCode(result) == k_EStoveCommonResultCode_Success)
{
const wchar_t* nation = Stove_IStoveGds_GetNation(gds);
const wchar_t* timezone = Stove_IStoveGds_GetTimezone(gds);
// 성공 시 로직을 구현해 주세요.
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)gds);
}
else
{
// 실패 시 로직을 구현해 주세요.
}
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
Notes
Stove_Initialize()로 초기화가 끝난 뒤 호출해야 유효한 값을 받을 수 있어요.
See Also
IStoveInitializeParam
종류 구조체 · 모듈 Base · 버전 3.5.0
Description
Stove_Initialize() 호출에 필요한 파라미터를 담아요. IAP 상점 키와 게임 메인 윈도우 핸들을 설정하는 용도로만 쓰예요.
Stove_CreateParam(k_EStoveBaseTypeKind_InitializeParam) 으로 생성한 뒤 필요한 필드를 설정하고, 호출이 끝나면 Destroy() 로 해제해요. ShopKey 를 비워두지 않으면 Stove_Initialize() 가 IAP 모듈도 함께 초기화하며, MainWndHandle 을 설정하면 View 모듈(및 ShopKey 가 있으면 IAP 모듈)을 함께 초기화해요. initParam 자체를 null 로 전달하면 SDK 만 초기화해요.
MainWndHandle은 게임의 메인 윈도우가 실제로 생성된 뒤에만 유효한 값이에요.
Declaration
typedef struct IStoveInitializeParam IStoveInitializeParam;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
ShopKey | const wchar_t* | 읽기·쓰기 | Stove_IStoveInitializeParam_GetShopKey() / SetShopKey() | IAP 상점 키예요. 값이 비어 있지 않으면 Stove_Initialize() 가 IAP 모듈을 함께 초기화해요. 비워두면 IAP 초기화를 건너뛰어요. |
MainWndHandle | const void* | 읽기·쓰기 | Stove_IStoveInitializeParam_GetMainWndHandle() / SetMainWndHandle() | 게임 메인 윈도우 핸들(HWND, const void* 로 전달)이에요. 윈도우가 생성된 뒤에만 유효하며, 값이 있으면 View 모듈(및 ShopKey 가 있으면 IAP 모듈)을 초기화해요. 비워두면 View/IAP 설정을 건너뛰어요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 호출자 (Stove_CreateParam(k_EStoveBaseTypeKind_InitializeParam)) |
| 해제 책임 | 호출자 (Destroy() 필수) — API 호출이 끝난 뒤 해제해요. |
Example
IStoveInitializeParam* initParam =
(IStoveInitializeParam*)Stove_CreateParam(k_EStoveBaseTypeKind_InitializeParam);
Stove_IStoveInitializeParam_SetShopKey(initParam, L"YOUR_SHOP_KEY");
Stove_IStoveInitializeParam_SetMainWndHandle(initParam, hWnd);
IStoveResult* result = Stove_Initialize(initParam);
if (Stove_IStoveResult_GetResultCode(result) == k_EStoveCommonResultCode_Success)
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)initParam);
Notes
- Environment/GameId/AppKey 는 이 타입에 없어요. 현재 인터페이스에서는 IStoveRestartAppIfNecessaryParam 으로 옮겨졌고, SDK 가
Stove_RestartAppIfNecessary()호출 시 캐시한 값을Stove_Initialize()에서 재사용해요. ShopKey,MainWndHandle은 단일 바이너리 통합 이후 IAP/View 모듈을 함께 초기화하기 위해 추가된 필드예요.Stove_Initialize()가 일부만 성공(예: SDK/View 는 성공, IAP 는 실패)한 경우 SDK 는 부분 초기화 상태로 남을 수 있어요. 복구하려면Stove_Uninitialize()를 호출한 뒤 다시Stove_Initialize()를 호출해야 해요.
See Also
IStoveInventoryItem
종류 구조체 · 모듈 IAP · 버전 3.5.0
Description
사용자의 구매 이력 한 건을 나타내요. Stove_FetchInventory 호출 결과로 IStoveInventoryList 에 담겨 OnFetchInventoryCallback 콜백에 전달돼요.
SDK 가 채워서 콜백으로 전달하는 데이터형이에요. 호출자가 직접 만들지 않아요.
콜백으로 전달되는 목록과 각 항목은 SDK 소유이며 콜백 호출이 끝나면 더 이상 유효하지 않아요.
Destroy()를 호출하지 말고, 보관이 필요한 값은 콜백 안에서 복사해 두어야 해요.
Declaration
typedef struct IStoveInventoryItem IStoveInventoryItem;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
TxnMasterNo | int64_t | 읽기 | Stove_IStoveInventoryItem_GetTxnMasterNo() | 트랜잭션 마스터 번호 |
TxnDetailNo | int64_t | 읽기 | Stove_IStoveInventoryItem_GetTxnDetailNo() | 트랜잭션 상세 번호 (상품별 TID) |
ProductId | int64_t | 읽기 | Stove_IStoveInventoryItem_GetProductId() | 플랫폼 고유 상품 식별자 |
InserviceItemId | const wchar_t* | 읽기 | Stove_IStoveInventoryItem_GetInserviceItemId() | 이 상품에 매핑된 게임 내 아이템 식별자 |
ProductName | const wchar_t* | 읽기 | Stove_IStoveInventoryItem_GetProductName() | 현지화된 상품 이름 |
Quantity | int32_t | 읽기 | Stove_IStoveInventoryItem_GetQuantity() | 구매한 수량 |
ThumbnailUrl | const wchar_t* | 읽기 | Stove_IStoveInventoryItem_GetThumbnailUrl() | 상품 대표 썸네일 이미지 URL |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지 — 콜백이 끝나면 무효) |
Example
void __cdecl OnFetchInventoryCallback(const IStoveCallbackResult* callbackResult, const IStoveInventoryList* list)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == 0)
{
uint32_t count = Stove_IStoveInventoryList_GetCount(list);
for (uint32_t i = 0; i < count; ++i)
{
const IStoveInventoryItem* item = Stove_IStoveInventoryList_GetAt(list, i);
int64_t productId = Stove_IStoveInventoryItem_GetProductId(item);
int32_t quantity = Stove_IStoveInventoryItem_GetQuantity(item);
// 필요한 값만 복사해서 보관해 주세요.
}
// list 와 각 항목은 이 콜백이 끝나면 무효처리됩니다. Destroy() 를 호출하지 마십시오.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Notes
- Stove_FetchInventory 의 출력으로만 전달돼요.
- 게임 아이템 지급 여부 확인 시
TxnDetailNo를 기준으로 중복 처리를 방지해야 해요.
See Also
IStoveInventoryList
종류 구조체 · 모듈 IAP · 버전 3.5.0
Description
OnFetchInventoryCallback 콜백에 전달되는 컨테이너예요. Stove_FetchInventory 가 돌려주는 IStoveInventoryItem 배열을 감싸요.
SDK 가 채워서 콜백으로 전달하는 데이터형이에요. 호출자가 직접 만들지 않아요.
이 객체와
GetAt()으로 얻는 각 항목은 모두 SDK 소유이며 콜백 호출이 끝나면 더 이상 유효하지 않아요.Destroy()를 호출하지 말고, 보관이 필요한 값은 콜백 안에서 복사해 두어야 해요.
Declaration
typedef struct IStoveInventoryList IStoveInventoryList;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
Count | uint32_t | 읽기 | Stove_IStoveInventoryList_GetCount() | 결과에 담긴 구매 이력 항목 수 |
At(index) | const IStoveInventoryItem* | 읽기 | Stove_IStoveInventoryList_GetAt() | index(0부터 시작) 위치의 구매 이력 항목. index >= Count 이면 nullptr 을 반환해요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지 — 콜백이 끝나면 무효) |
Example
void __cdecl OnFetchInventoryCallback(const IStoveCallbackResult* callbackResult, const IStoveInventoryList* list)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == 0)
{
uint32_t count = Stove_IStoveInventoryList_GetCount(list);
for (uint32_t i = 0; i < count; ++i)
{
const IStoveInventoryItem* item = Stove_IStoveInventoryList_GetAt(list, i);
// 필요한 값만 복사해서 보관해 주세요.
}
// list 와 각 항목은 이 콜백이 끝나면 무효처리됩니다. Destroy() 를 호출하지 마십시오.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Notes
- Stove_FetchInventory 의 출력으로만 전달돼요.
- 예전에는 배열과 개수를 콜백 인자로 각각 따로 받는 방식이었으나, 지금은 이 컨테이너 하나로 감싸 전달돼요.
See Also
IStoveManualPopupParam
종류 구조체 · 모듈 View · 버전 3.5.0
Description
IStoveManualPopupParam 은 수동 팝업(Manual Popup) 을 표시할 때 사용하는 파라미터 타입이에요. ResourceKey 로 어떤 팝업 콘텐츠를 표시할지 지정해요. Stove_ManualPopup 의 입력으로 사용해요.
호출자가 Stove_CreateParam(k_EStoveViewTypeKind_ManualPopupParam) 으로 생성하고, 값을 채운 뒤 API 호출이 끝나면 Destroy() 로 해제해요.
Declaration
typedef struct IStoveManualPopupParam IStoveManualPopupParam;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Required | Access | Accessor | Description |
|---|---|---|---|---|---|
WebViewMode | int32_t | 예 | 읽기·쓰기 | Stove_IStoveManualPopupParam_GetWebViewMode() / SetWebViewMode() | 웹뷰 표시 모드예요. EStoveWebViewMode 값(External / Internal)을 담아요. |
ResourceKey | const wchar_t* | 예 | 읽기·쓰기 | Stove_IStoveManualPopupParam_GetResourceKey() / SetResourceKey() | 표시할 수동 팝업을 식별하는 리소스 키예요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 호출자 (Stove_CreateParam(k_EStoveViewTypeKind_ManualPopupParam)) |
| 해제 책임 | 호출자 (Destroy() 필수) |
Example
IStoveManualPopupParam* param =
(IStoveManualPopupParam*)Stove_CreateParam(k_EStoveViewTypeKind_ManualPopupParam);
Stove_IStoveManualPopupParam_SetWebViewMode(param, k_EStoveWebViewMode_Internal);
Stove_IStoveManualPopupParam_SetResourceKey(param, L"EVENT_BANNER_01");
Stove_ManualPopup(param, OnPopupFinished, OnPopupDestroyed, NULL, NULL);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param);
Notes
ResourceKey를 설정하지 않으면 어떤 팝업 콘텐츠를 표시할지 결정할 수 없어요.
See Also
IStoveOrderProductParam
종류 구조체 · 모듈 IAP · 버전 3.5.0
Description
IStoveStartPurchaseParam 에 담기는 상품별 주문 항목이에요. 구매할 상품 하나당 하나씩 만들어 SetProducts() 로 전달해요.
Stove_CreateParam(k_EStoveIAPTypeKind_OrderProductParam) 으로 생성하고, setter 로 값을 채운 뒤 구매 호출이 끝나면(또는 상위 IStoveStartPurchaseParam 이 해제된 뒤) Destroy() 로 해제해야 해요.
Declaration
typedef struct IStoveOrderProductParam IStoveOrderProductParam;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Required | Accessor | Description |
|---|---|---|---|---|---|
ProductId | int64_t | 읽기·쓰기 | 예 | Stove_IStoveOrderProductParam_GetProductId() / Stove_IStoveOrderProductParam_SetProductId() | 플랫폼 고유 상품 식별자. IStoveProduct 의 ProductId 와 일치해야 해요. |
SalePrice | double | 읽기·쓰기 | 예 | Stove_IStoveOrderProductParam_GetSalePrice() / Stove_IStoveOrderProductParam_SetSalePrice() | 클라이언트가 관찰한 이 상품의 단가(판매가). 서버가 클라이언트/서버 가격 불일치를 검사하는 데 사용해요. |
Quantity | int32_t | 읽기·쓰기 | 예 | Stove_IStoveOrderProductParam_GetQuantity() / Stove_IStoveOrderProductParam_SetQuantity() | 구매할 수량 |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 호출자 (Stove_CreateParam(k_EStoveIAPTypeKind_OrderProductParam)) |
| 해제 책임 | 호출자 (Destroy() 필수) |
Example
IStoveOrderProductParam* orderProduct = (IStoveOrderProductParam*)Stove_CreateParam(k_EStoveIAPTypeKind_OrderProductParam);
Stove_IStoveOrderProductParam_SetProductId(orderProduct, productId);
Stove_IStoveOrderProductParam_SetSalePrice(orderProduct, salePrice);
Stove_IStoveOrderProductParam_SetQuantity(orderProduct, 1);
IStoveOrderProductParam* orderProducts[] = { orderProduct };
// startPurchaseParam 은 IStoveStartPurchaseParam 문서를 참고해 미리 생성해 주세요.
Stove_IStoveStartPurchaseParam_SetProducts(startPurchaseParam, orderProducts, 1);
Stove_StartPurchase(startPurchaseParam, OnStartPurchaseCallback, NULL, NULL, NULL);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)orderProduct);
Notes
SetProducts()는 소유권을 넘겨받지 않아요. 호출자가IStoveOrderProductParam객체의 소유권을 계속 가지며, 구매 호출이 끝난 뒤 직접Destroy()해야 해요.SalePrice는 IStoveProduct 의SalePrice값을 그대로 사용해 주세요. 값이 다르면 서버에서 가격 불일치로 처리될 수 있어요.
See Also
IStoveOverImmersionInfo
종류 구조체 · 모듈 Base · 버전 3.5.0
Description
Stove_OverImmersionNotification() 콜백으로 전달되는 과몰입 방지 고지 정보예요. 한국 전용 API 예요.
과몰입 경고 메시지와 게임 누적 이용 시간(시간 단위), 메시지 노출 시간을 담아요. SDK 가 만들어 콜백 인자로만 전달하며, 호출자는 해제하지 않아요.
이 콜백은 1회성이 아니라 대상 사용자에게 매시간 반복해서 전달돼요. 알림을 화면에 띄울 수 있는 시점 이후에 등록해야 해요.
Declaration
typedef struct IStoveOverImmersionInfo IStoveOverImmersionInfo;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
Msg | const wchar_t* | 읽기 | Stove_IStoveOverImmersionInfo_GetMsg() | 과몰입 경고 메시지예요. |
ElapsedHours | int32_t | 읽기 | Stove_IStoveOverImmersionInfo_GetElapsedHours() | 게임 누적 이용 시간(시간 단위)예요. |
ExposureTime | int32_t | 읽기 | Stove_IStoveOverImmersionInfo_GetExposureTime() | 메시지 노출 시간(초)예요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK — 콜백 인자로만 전달되며 콜백이 끝나면 무효처리돼요. 호출자는 Destroy() 를 호출하지 않아요. |
Example
void __cdecl OnOverImmersionNotificationCallback(const IStoveCallbackResult* callbackResult, const IStoveOverImmersionInfo* overImmersion)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == k_EStoveCommonResultCode_Success)
{
const wchar_t* msg = Stove_IStoveOverImmersionInfo_GetMsg(overImmersion);
int32_t elapsedHours = Stove_IStoveOverImmersionInfo_GetElapsedHours(overImmersion);
// 성공 시 로직을 구현해 주세요. (경고 메시지 표시)
}
else
{
// 실패 시 로직을 구현해 주세요.
}
// overImmersion 은 Destroy() 를 호출하지 않습니다.
}
Notes
- 한국 전용 API 예요. 콜백은 1회성이 아니라 대상 사용자에게 매시간 반복해서 전달되므로, 알림을 화면에 띄울 수 있는 시점 이후에 등록해야 해요.
ElapsedHours단위는 시간(hour)이에요. 분 단위인 IStoveVietnamOverimmersionInfo 의ElapsedMinutes와 혼동하지 않도록 주의해요.
See Also
IStovePCBangBenefitInfo
종류 구조체 · 모듈 PCBang · 버전 3.5.0
Description
Stove_PCBangLogin 의 onRefreshBenefit 콜백으로 전달되는, 갱신된 PC방 혜택 정보 구조체예요. 레거시 이름은 StovePCBangUserBenefit 이에요.
호출자가 만들지 않으며, SDK 가 생성해 콜백 인자로만 전달해요. Destroy() 를 호출하지 않아요.
이 콜백은 1회성이 아니에요. 로그인 성공 이후 PC방 세션이 유지되는 동안 4분 주기로 계속 반복 전달돼요.
Declaration
typedef struct IStovePCBangBenefitInfo IStovePCBangBenefitInfo;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
PremiumCheck | int32_t | 읽기 | Stove_IStovePCBangBenefitInfo_GetPremiumCheck() | PC방 프리미엄 상태예요. EStovePCBangPremium 값이에요. |
RemainTime | int32_t | 읽기 | Stove_IStovePCBangBenefitInfo_GetRemainTime() | 남은 유료 혜택 시간(초)예요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지) — Stove_PCBangLogin 의 onRefreshBenefit 콜백 인자로만 전달되며, 콜백이 끝나면 무효처리돼요. |
Example
void __cdecl OnRefreshBenefit(const IStoveCallbackResult* callbackResult, const IStovePCBangBenefitInfo* benefitInfo)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == 0)
{
int32_t premium = Stove_IStovePCBangBenefitInfo_GetPremiumCheck(benefitInfo);
int32_t remainTime = Stove_IStovePCBangBenefitInfo_GetRemainTime(benefitInfo);
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Notes
- 레거시 이름은
StovePCBangUserBenefit이에요. - 이 구조체는 Stove_PCBangLogin 의
onRefreshBenefit콜백으로 4분 주기로 반복 전달돼요. 로그인 성공 이후 계속 호출되며, Stove_PCBangLogout 을 호출해야 중단돼요. - 이 반복 갱신은
PremiumCheck값이 유료(Premium)와 무료(Free) 상태 모두에서 계속 호출돼요. 갱신 응답이 정상적으로 도착했지만 그 값이FreeOther인 경우에는 반복이 멈춰요. 반면 네트워크 등의 이유로 갱신 요청 자체가 실패한 회차는 반복을 멈추지 않고 다음 4분 주기에 다시 시도해요. PremiumCheck값의 의미는 EStovePCBangPremium 를 참조하세요.
See Also
IStovePCBangLoginOutcome
종류 구조체 · 모듈 PCBang · 버전 3.5.0
Description
Stove_PCBangLogin 의 onUserLogin 콜백으로 전달되는 최초 로그인 결과 구조체예요. 레거시 이름은 StovePCBangLogin 이에요.
호출자가 만들지 않으며, SDK 가 생성해 콜백 인자로만 전달해요. Destroy() 를 호출하지 않아요.
Declaration
typedef struct IStovePCBangLoginOutcome IStovePCBangLoginOutcome;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
PremiumCheck | int32_t | 읽기 | Stove_IStovePCBangLoginOutcome_GetPremiumCheck() | PC방 프리미엄 상태예요. EStovePCBangPremium 값이에요. |
Psn | int32_t | 읽기 | Stove_IStovePCBangLoginOutcome_GetPsn() | 사용자에게 할당된 PC방 좌석/세션 번호(PSN)이에요. |
RemainTime | int32_t | 읽기 | Stove_IStovePCBangLoginOutcome_GetRemainTime() | 남은 유료 혜택 시간(초)예요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지) — Stove_PCBangLogin 의 onUserLogin 콜백 인자로만 전달되며, 콜백이 끝나면 무효처리돼요. |
Example
void __cdecl OnUserLogin(const IStoveCallbackResult* callbackResult, const IStovePCBangLoginOutcome* loginOutcome)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == 0)
{
int32_t premium = Stove_IStovePCBangLoginOutcome_GetPremiumCheck(loginOutcome);
int32_t psn = Stove_IStovePCBangLoginOutcome_GetPsn(loginOutcome);
int32_t remainTime = Stove_IStovePCBangLoginOutcome_GetRemainTime(loginOutcome);
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Notes
- 레거시 이름은
StovePCBangLogin이에요. - Stove_PCBangLogin 의
onUserLogin콜백에는 최초 로그인 결과에 대해 1회만 전달돼요. 이후 4분 주기로 반복 전달되는 갱신 정보는 별도 구조체인 IStovePCBangBenefitInfo 로 전달돼요. PremiumCheck값의 의미는 EStovePCBangPremium 를 참조하세요.
See Also
IStovePCBangStatus
종류 구조체 · 모듈 PCBang · 버전 3.5.0
Description
Stove_PCBangCheckStatus 가 콜백으로 전달하는, 현재 PC방 상황과 사용자가 이용 가능한 상품(entitlement) 정보를 담은 구조체예요. 레거시 이름은 StovePCBangUserStatus 이에요.
호출자가 만들지 않으며, SDK 가 생성해 콜백 인자로만 전달해요. Destroy() 를 호출하지 않아요.
Declaration
typedef struct IStovePCBangStatus IStovePCBangStatus;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
PremiumCheck | int32_t | 읽기 | Stove_IStovePCBangStatus_GetPremiumCheck() | PC방 프리미엄 상태예요. EStovePCBangPremium 값이에요. |
Psn | int32_t | 읽기 | Stove_IStovePCBangStatus_GetPsn() | 사용자에게 할당된 PC방 좌석/세션 번호(PSN)이에요. |
ProductCode | int32_t | 읽기 | Stove_IStovePCBangStatus_GetProductCode() | 프리미엄 PC방 상품 코드예요. -1 이면 상품 없음(오류 또는 미보유), 양수이면 사용자가 현재 이용 중인 상품의 서버 지정 식별자예요(서버가 결정하는 값이며 고정된 열거형이 아니에요). |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지) — Stove_PCBangCheckStatus 콜백 인자로만 전달되며, 콜백이 끝나면 무효처리돼요. |
Example
void __cdecl OnCheckStatus(const IStoveCallbackResult* callbackResult, const IStovePCBangStatus* status)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == 0)
{
int32_t premium = Stove_IStovePCBangStatus_GetPremiumCheck(status);
int32_t psn = Stove_IStovePCBangStatus_GetPsn(status);
int32_t productCode = Stove_IStovePCBangStatus_GetProductCode(status);
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Notes
- 레거시 이름은
StovePCBangUserStatus이에요. - Stove_PCBangCheckStatus 의 콜백에만 전달돼요.
RemainTime대신ProductCode를 가진다는 점에서 IStovePCBangLoginOutcome· IStovePCBangBenefitInfo 와 필드 구성이 달라요.PremiumCheck값의 의미는 EStovePCBangPremium 를 참조하세요.
See Also
IStovePopupParam
종류 구조체 · 모듈 View · 버전 3.5.0
Description
IStovePopupParam 은 오토 팝업, 뉴스 팝업, 쿠폰 팝업 세 API 가 공통으로 사용하는 파라미터 타입이에요. 이 API 들은 팝업 종류만 다르고 입력 파라미터 구조가 같기 때문에 하나의 타입을 공유해요.
- Stove_AutoPopup: 오토 팝업 표시
- Stove_NewsPopup: 뉴스 팝업 표시
- Stove_CouponPopup: 쿠폰 팝업 표시
호출자가 Stove_CreateParam(k_EStoveViewTypeKind_PopupParam) 으로 생성하고, 값을 채운 뒤 API 호출이 끝나면 Destroy() 로 해제해요.
Declaration
typedef struct IStovePopupParam IStovePopupParam;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Required | Access | Accessor | Description |
|---|---|---|---|---|---|
WebViewMode | int32_t | 예 | 읽기·쓰기 | Stove_IStovePopupParam_GetWebViewMode() / SetWebViewMode() | 웹뷰 표시 모드예요. EStoveWebViewMode 값(External / Internal)을 담아요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 호출자 (Stove_CreateParam(k_EStoveViewTypeKind_PopupParam)) |
| 해제 책임 | 호출자 (Destroy() 필수) |
Example
IStovePopupParam* param =
(IStovePopupParam*)Stove_CreateParam(k_EStoveViewTypeKind_PopupParam);
Stove_IStovePopupParam_SetWebViewMode(param, k_EStoveWebViewMode_Internal);
Stove_AutoPopup(param, OnPopupFinished, OnPopupDestroyed, NULL, NULL);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param);
Notes
- 같은
IStovePopupParam인스턴스를 세 API 에 재사용할 수 있으나, 각 호출이 끝나기 전에 값을 바꾸지 않도록 주의해야 해요. Stove_ManualPopup,Stove_VerifyIdentificationPopup은 이 타입을 쓰지 않고 각각 IStoveManualPopupParam, IStoveVerifyIdentificationPopupParam 을 사용해요.
See Also
IStoveProduct
종류 구조체 · 모듈 IAP · 버전 3.5.0
Description
상점에서 판매하는 상품 하나를 나타내요. Stove_FetchProducts 호출 결과로 IStoveProductList 에 담겨 OnFetchProductsCallback 콜백에 전달돼요.
SDK 가 채워서 콜백으로 전달하는 데이터형이에요. 호출자가 직접 만들지 않아요. 멤버가 32개로 많아 아래 멤버 표를 성격별로 나누어 정리했어요.
콜백으로 전달되는 목록과 각 항목은 SDK 소유이며 콜백 호출이 끝나면 더 이상 유효하지 않아요.
Destroy()를 호출하지 말고, 보관이 필요한 값은 콜백 안에서 복사해 두어야 해요.
Declaration
typedef struct IStoveProduct IStoveProduct;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
기본 정보
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
ProductId | int64_t | 읽기 | Stove_IStoveProduct_GetProductId() | 플랫폼 고유 상품 식별자 |
InserviceItemId | const wchar_t* | 읽기 | Stove_IStoveProduct_GetInserviceItemId() | 이 상품에 매핑된 게임 내 아이템 식별자 |
ProductName | const wchar_t* | 읽기 | Stove_IStoveProduct_GetProductName() | 현지화된 상품 이름 |
ProductDescription | const wchar_t* | 읽기 | Stove_IStoveProduct_GetProductDescription() | 현지화된 상품 설명 |
Quantity | int32_t | 읽기 | Stove_IStoveProduct_GetQuantity() | 이 상품 1회 구매 시 지급되는 아이템 수량 |
ProductTypeCode | EStoveProductTypeCode | 읽기 | Stove_IStoveProduct_GetProductTypeCode() | 상품 분류 코드 |
CategoryId | const wchar_t* | 읽기 | Stove_IStoveProduct_GetCategoryId() | 이 상품이 속한 상점 카테고리 식별자 |
CategoryName | const wchar_t* | 읽기 | Stove_IStoveProduct_GetCategoryName() | 이 상품이 속한 상점 카테고리의 현지화된 이름 |
ThumbnailUrl | const wchar_t* | 읽기 | Stove_IStoveProduct_GetThumbnailUrl() | 상품 대표 썸네일 이미지 URL |
가격
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
CurrencyCode | const wchar_t* | 읽기 | Stove_IStoveProduct_GetCurrencyCode() | ISO 4217 통화 코드 (예: L"USD", L"KRW") |
Price | double | 읽기 | Stove_IStoveProduct_GetPrice() | 결제 처리에 사용되는 정가 |
DisplayPrice | double | 읽기 | Stove_IStoveProduct_GetDisplayPrice() | 화면 표시에 사용되는 정가 (반올림 등으로 Price 와 다를 수 있음) |
StrDisplayPrice | const wchar_t* | 읽기 | Stove_IStoveProduct_GetStrDisplayPrice() | 통화 서식이 적용된 표시용 정가 문자열 |
SalePrice | double | 읽기 | Stove_IStoveProduct_GetSalePrice() | 결제 처리에 사용되는 판매가 (할인 중이 아니면 Price 와 동일) |
DisplaySalePrice | double | 읽기 | Stove_IStoveProduct_GetDisplaySalePrice() | 화면 표시에 사용되는 판매가 |
StrDisplaySalePrice | const wchar_t* | 읽기 | Stove_IStoveProduct_GetStrDisplaySalePrice() | 통화 서식이 적용된 표시용 판매가 문자열 |
할인
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
IsDiscounted | bool | 읽기 | Stove_IStoveProduct_IsDiscounted() | 현재 할인 중인지 여부 |
DiscountType | EStoveDiscountType | 읽기 | Stove_IStoveProduct_GetDiscountType() | 할인 계산 방식 |
DiscountTypeValue | int32_t | 읽기 | Stove_IStoveProduct_GetDiscountTypeValue() | 할인 값. DiscountType 이 FixedRate 이면 퍼센트(예: 10 = 10% 할인), FlatRate 이면 상품 통화 기준 정액 할인액 |
DiscountStartDate | int64_t | 읽기 | Stove_IStoveProduct_GetDiscountStartDate() | 할인 시작 시각 (UTC epoch milliseconds) |
DiscountEndDate | int64_t | 읽기 | Stove_IStoveProduct_GetDiscountEndDate() | 할인 종료 시각 (UTC epoch milliseconds) |
구매 수량 및 이력
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
TotalQuantity | int32_t | 읽기 | Stove_IStoveProduct_GetTotalQuantity() | 모든 범위를 통틀어 이 상품이 구매된 총수량 |
MemberQuantity | int32_t | 읽기 | Stove_IStoveProduct_GetMemberQuantity() | 로그인 계정(회원) 범위에서 구매된 수량 |
GuidQuantity | int32_t | 읽기 | Stove_IStoveProduct_GetGuidQuantity() | 현재 캐릭터 GUID 범위에서 구매된 수량 |
HasPurchased | bool | 읽기 | Stove_IStoveProduct_HasPurchased() | 사용자가 이 상품을 한 번이라도 구매한 적이 있는지 여부 |
IsWithdrawable | bool | 읽기 | Stove_IStoveProduct_IsWithdrawable() | 청약철회(소비자 보호 환불) 규정이 적용되는 상품인지 여부 |
구매 제한 및 판매 기간
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
PurchaseLimitTypeCode | EStovePurchaseLimitTypeCode | 읽기 | Stove_IStoveProduct_GetPurchaseLimitTypeCode() | 구매 제한 정책 |
PurchaseLimitCount | int32_t | 읽기 | Stove_IStoveProduct_GetPurchaseLimitCount() | 현재 정책 하의 구매 횟수 제한 |
SaleLimitCount | int32_t | 읽기 | Stove_IStoveProduct_GetSaleLimitCount() | 상품의 총 판매 수량 제한 (0 이면 무제한) |
SalesStartDate | int64_t | 읽기 | Stove_IStoveProduct_GetSalesStartDate() | 판매 기간 시작 시각 (UTC epoch milliseconds) |
SalesEndDate | int64_t | 읽기 | Stove_IStoveProduct_GetSalesEndDate() | 판매 기간 종료 시각 (UTC epoch milliseconds) |
PurchaseAvailabilityCode | int16_t | 읽기 | Stove_IStoveProduct_GetPurchaseAvailabilityCode() | 구매 가능 여부 코드. 1: 구매 가능, 2: 구매 불가능(구매 제한 초과), 3: 구매 불가능(웹 스토어 품절), 4: 구매 불가능(웹 스토어에서 이미 수령함). 이 값 집합은 서버에서 확장될 수 있어요. 상품 1개 단위 구매 요청 기준이며, 2개 이상을 함께 구매 요청하면 결과가 다를 수 있어요. 서버 API 스키마가 이 필드(및 다른 code 필드들)를 Int16 으로 정의해서 타입이 int16_t 이에요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지 — 콜백이 끝나면 무효) |
Example
void __cdecl OnFetchProductsCallback(const IStoveCallbackResult* callbackResult, const IStoveProductList* list)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == 0)
{
uint32_t count = Stove_IStoveProductList_GetCount(list);
for (uint32_t i = 0; i < count; ++i)
{
const IStoveProduct* product = Stove_IStoveProductList_GetAt(list, i);
int64_t productId = Stove_IStoveProduct_GetProductId(product);
const wchar_t* productName = Stove_IStoveProduct_GetProductName(product);
double salePrice = Stove_IStoveProduct_GetSalePrice(product);
bool onSale = Stove_IStoveProduct_IsDiscounted(product);
// 필요한 값만 복사해서 보관해 주세요.
}
// list 와 각 항목은 이 콜백이 끝나면 무효처리됩니다. Destroy() 를 호출하지 마십시오.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Notes
- Stove_FetchProducts 의 출력으로만 전달돼요.
Price/SalePrice는 결제 처리(서버 검증)에 사용하고,DisplayPrice/DisplaySalePrice/StrDisplayPrice/StrDisplaySalePrice는 화면 표시에만 사용해 주세요.- 구매 시 서버가 관찰한 가격과의 불일치를 검사하므로, IStoveOrderProductParam 의
SalePrice에는 이 상품의SalePrice값을 그대로 전달해야 해요. DiscountStartDate/DiscountEndDate/SalesStartDate/SalesEndDate는 모두 UTC epoch milliseconds(1970-01-01 UTC 기준 밀리초) 정수예요.YYYYMMDDHHMMSS형식이 아니에요.
See Also
IStoveProductList
종류 구조체 · 모듈 IAP · 버전 3.5.0
Description
OnFetchProductsCallback 콜백에 전달되는 컨테이너예요. Stove_FetchProducts 가 돌려주는 IStoveProduct 배열을 감싸요.
SDK 가 채워서 콜백으로 전달하는 데이터형이에요. 호출자가 직접 만들지 않아요.
이 객체와
GetAt()으로 얻는 각 항목은 모두 SDK 소유이며 콜백 호출이 끝나면 더 이상 유효하지 않아요.Destroy()를 호출하지 말고, 보관이 필요한 값은 콜백 안에서 복사해 두어야 해요.
Declaration
typedef struct IStoveProductList IStoveProductList;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
Count | uint32_t | 읽기 | Stove_IStoveProductList_GetCount() | 결과에 담긴 상품 수 |
At(index) | const IStoveProduct* | 읽기 | Stove_IStoveProductList_GetAt() | index(0부터 시작) 위치의 상품. index >= Count 이면 nullptr 을 반환해요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지 — 콜백이 끝나면 무효) |
Example
void __cdecl OnFetchProductsCallback(const IStoveCallbackResult* callbackResult, const IStoveProductList* list)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == 0)
{
uint32_t count = Stove_IStoveProductList_GetCount(list);
for (uint32_t i = 0; i < count; ++i)
{
const IStoveProduct* product = Stove_IStoveProductList_GetAt(list, i);
// 필요한 값만 복사해서 보관해 주세요.
}
// list 와 각 항목은 이 콜백이 끝나면 무효처리됩니다. Destroy() 를 호출하지 마십시오.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Notes
- Stove_FetchProducts 의 출력으로만 전달돼요.
- 예전에는 배열과 개수를 콜백 인자로 각각 따로 받는 방식이었으나, 지금은 이 컨테이너 하나로 감싸 전달돼요.
See Also
IStovePurchasedProduct
종류 구조체 · 모듈 IAP · 버전 3.5.0
Description
완료된 구매(트랜잭션) 안의 상품 한 항목을 나타내요. Stove_StartPurchase 의 결과인 IStoveStartPurchaseOutcome 과 Stove_ConfirmPurchase 의 결과인 IStoveConfirmPurchaseOutcome 양쪽에 배열 형태로 담겨 전달돼요.
SDK 가 채워서 콜백으로 전달하는 데이터형이에요. 호출자가 직접 만들지 않아요.
콜백으로 전달되는 배열과 각 항목은 SDK 소유이며 콜백 호출이 끝나면 더 이상 유효하지 않아요.
Destroy()를 호출하지 말고, 보관이 필요한 값은 콜백 안에서 복사해 두어야 해요.
Declaration
typedef struct IStovePurchasedProduct IStovePurchasedProduct;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
TxnDetailNo | int64_t | 읽기 | Stove_IStovePurchasedProduct_GetTxnDetailNo() | 트랜잭션 상세 번호 (마스터 트랜잭션 내 상품별 TID) |
ProductId | int64_t | 읽기 | Stove_IStovePurchasedProduct_GetProductId() | 플랫폼 고유 상품 식별자 |
CategoryId | const wchar_t* | 읽기 | Stove_IStovePurchasedProduct_GetCategoryId() | 이 상품이 속한 상점 카테고리 식별자 |
TotalQuantity | int32_t | 읽기 | Stove_IStovePurchasedProduct_GetTotalQuantity() | 이 상품의 총 구매 수량 |
MemberQuantity | int32_t | 읽기 | Stove_IStovePurchasedProduct_GetMemberQuantity() | 회원(계정) 범위에서 구매된 수량 |
GuidQuantity | int32_t | 읽기 | Stove_IStovePurchasedProduct_GetGuidQuantity() | 현재 캐릭터 GUID 범위에서 구매된 수량 |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지 — 콜백이 끝나면 무효) |
Example
void __cdecl OnConfirmPurchaseCallback(const IStoveCallbackResult* callbackResult, const IStoveConfirmPurchaseOutcome* outcome)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == 0 && Stove_IStoveConfirmPurchaseOutcome_IsConfirmed(outcome))
{
uint32_t count = Stove_IStoveConfirmPurchaseOutcome_GetPurchasedProductCount(outcome);
for (uint32_t i = 0; i < count; ++i)
{
const IStovePurchasedProduct* purchasedProduct = Stove_IStoveConfirmPurchaseOutcome_GetPurchasedProductAt(outcome, i);
int64_t productId = Stove_IStovePurchasedProduct_GetProductId(purchasedProduct);
int32_t totalQuantity = Stove_IStovePurchasedProduct_GetTotalQuantity(purchasedProduct);
// 필요한 값만 복사해서 보관해 주세요.
}
// outcome 과 그 안의 항목은 이 콜백이 끝나면 무효처리됩니다. Destroy() 를 호출하지 마십시오.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Notes
- IStoveStartPurchaseOutcome 의
PurchasedProductAt()과 IStoveConfirmPurchaseOutcome 의PurchasedProductAt()양쪽에서 전달돼요. - 게임 아이템 지급은
TxnDetailNo를 기준으로 중복 처리를 방지해야 해요.
See Also
IStovePurchaseParam
종류 구조체 · 모듈 IAP · 버전 3.5.0
Description
IStoveStartPurchaseParam 에 담겨 Stove_StartPurchase 의 동작 방식을 결정하는 옵션이에요. IStoveWebViewLayoutParam 을 상속하며, WebView* 필드는 모두 Operation 이 Default 가 아닐 때만 적용돼요.
Stove_CreateParam(k_EStoveIAPTypeKind_PurchaseParam) 으로 생성하고, setter 로 값을 채운 뒤 구매 호출이 끝나면 Destroy() 로 해제해야 해요.
Declaration
typedef struct IStovePurchaseParam IStovePurchaseParam;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Required | Accessor | Description |
|---|---|---|---|---|---|
Operation | EStovePurchaseOperation | 읽기·쓰기 | 예 | Stove_IStovePurchaseParam_GetOperation() / Stove_IStovePurchaseParam_SetOperation() | 동작 방식 선택자 |
WebViewMode | EStoveWebViewMode | 읽기·쓰기 | 아니오 | Stove_IStovePurchaseParam_GetWebViewMode() / Stove_IStovePurchaseParam_SetWebViewMode() | 웹뷰 표시 모드 (외부 브라우저 / SDK 내장 웹뷰). Operation != Default 일 때만 적용돼요. IStoveWebViewLayoutParam 상속 멤버예요. |
WebViewPosX | int32_t | 읽기·쓰기 | 아니오 | Stove_IStovePurchaseParam_GetWebViewPosX() / Stove_IStovePurchaseParam_SetWebViewPosX() | 웹뷰 x 좌표 (픽셀). Operation != Default 일 때만 적용돼요. IStoveWebViewLayoutParam 상속 멤버예요. |
WebViewPosY | int32_t | 읽기·쓰기 | 아니오 | Stove_IStovePurchaseParam_GetWebViewPosY() / Stove_IStovePurchaseParam_SetWebViewPosY() | 웹뷰 y 좌표 (픽셀). Operation != Default 일 때만 적용돼요. IStoveWebViewLayoutParam 상속 멤버예요. |
WebViewWidth | int32_t | 읽기·쓰기 | 아니오 | Stove_IStovePurchaseParam_GetWebViewWidth() / Stove_IStovePurchaseParam_SetWebViewWidth() | 웹뷰 너비 (픽셀). Operation != Default 일 때만 적용돼요. IStoveWebViewLayoutParam 상속 멤버예요. |
WebViewHeight | int32_t | 읽기·쓰기 | 아니오 | Stove_IStovePurchaseParam_GetWebViewHeight() / Stove_IStovePurchaseParam_SetWebViewHeight() | 웹뷰 높이 (픽셀). Operation != Default 일 때만 적용돼요. IStoveWebViewLayoutParam 상속 멤버예요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 호출자 (Stove_CreateParam(k_EStoveIAPTypeKind_PurchaseParam)) |
| 해제 책임 | 호출자 (Destroy() 필수) |
Example
IStovePurchaseParam* purchaseParam = (IStovePurchaseParam*)Stove_CreateParam(k_EStoveIAPTypeKind_PurchaseParam);
Stove_IStovePurchaseParam_SetOperation(purchaseParam, k_EStovePurchaseOperation_WithWebViewAndConfirmResult);
Stove_IStovePurchaseParam_SetWebViewMode(purchaseParam, k_EStoveWebViewMode_Internal);
Stove_IStovePurchaseParam_SetWebViewWidth(purchaseParam, 480);
Stove_IStovePurchaseParam_SetWebViewHeight(purchaseParam, 640);
// startPurchaseParam 은 IStoveStartPurchaseParam 문서를 참고해 미리 생성해 주세요.
Stove_IStoveStartPurchaseParam_SetPurchaseParam(startPurchaseParam, purchaseParam);
Stove_StartPurchase(startPurchaseParam, OnStartPurchaseCallback, NULL, NULL, NULL);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)purchaseParam);
Notes
SetPurchaseParam()은 소유권을 넘겨받지 않아요. 호출자가 이 객체의 소유권을 계속 가지며, 구매 호출이 끝난 뒤 직접Destroy()해야 해요.Operation이Default이면WebView*필드는 무시돼요.
See Also
IStoveRestartAppIfNecessaryOutcome
종류 구조체 · 모듈 Base · 버전 3.5.0
Description
Stove_RestartAppIfNecessary() 비동기 호출의 결과를 담아요. requiresRestart 플래그 하나를 도메인 엔티티로 감싸, 향후 필드가 추가되어도 콜백 시그니처가 바뀌지 않도록 설계되어 있어요.
SDK 가 만들어 콜백 인자로만 전달하며, 호출자는 해제하지 않아요.
Declaration
typedef struct IStoveRestartAppIfNecessaryOutcome IStoveRestartAppIfNecessaryOutcome;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
IsRestartRequired | bool | 읽기 | Stove_IStoveRestartAppIfNecessaryOutcome_IsRestartRequired() | true 면 앱을 Stove 런처를 통해 다시 실행해야 해요(현재 프로세스는 종료해야 해요). false 면 계속 진행해도 돼요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK — 콜백 인자로만 전달되며 콜백이 끝나면 무효처리돼요. 호출자는 Destroy() 를 호출하지 않아요. |
Example
void __cdecl OnRestartAppIfNecessaryCallback(const IStoveCallbackResult* callbackResult, const IStoveRestartAppIfNecessaryOutcome* outcome)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == k_EStoveCommonResultCode_Success)
{
if (Stove_IStoveRestartAppIfNecessaryOutcome_IsRestartRequired(outcome))
{
// 앱을 종료하는 로직을 구현해 주세요.
}
else
{
// 계속 진행하는 로직을 구현해 주세요(Stove_Initialize() 호출 등).
}
}
else
{
// 실패 시 로직을 구현해 주세요.
}
// outcome 은 Destroy() 를 호출하지 않습니다.
}
Notes
Stove_RestartAppIfNecessary()는Stove_Initialize()보다 먼저 호출해야 해요.IsRestartRequired()가 true 인데 프로세스를 종료하지 않으면 이후 SDK 동작이 올바르지 않을 수 있어요.
See Also
IStoveRestartAppIfNecessaryParam
종류 구조체 · 모듈 Base · 버전 3.5.0
Description
Stove_RestartAppIfNecessary() 호출에 필요한 파라미터를 담아요. Stove 환경, 게임 ID, 애플리케이션 키, 플랫폼 이름과 런처 확인 관련 옵션을 포함해요.
Stove_CreateParam(k_EStoveBaseTypeKind_RestartAppIfNecessaryParam) 으로 생성한 뒤 각 필드를 설정하고, 호출이 끝나면 Destroy() 로 해제해요.
Declaration
typedef struct IStoveRestartAppIfNecessaryParam IStoveRestartAppIfNecessaryParam;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
Environment | const wchar_t* | 읽기·쓰기 | Stove_IStoveRestartAppIfNecessaryParam_GetEnvironment() / SetEnvironment() | Stove 환경 값이에요. |
GameId | const wchar_t* | 읽기·쓰기 | Stove_IStoveRestartAppIfNecessaryParam_GetGameId() / SetGameId() | Stove 게임 ID 값이에요. |
AppKey | const wchar_t* | 읽기·쓰기 | Stove_IStoveRestartAppIfNecessaryParam_GetAppKey() / SetAppKey() | Stove 애플리케이션 키 값이에요. |
WaitTimeMilliSec | uint32_t | 읽기·쓰기 | Stove_IStoveRestartAppIfNecessaryParam_GetWaitTimeMilliSec() / SetWaitTimeMilliSec() | 앱이 런처를 통해 실행되었는지 확인하는 대기 시간(밀리초)예요. |
LaunchStoveLauncher | bool | 읽기·쓰기 | Stove_IStoveRestartAppIfNecessaryParam_GetLaunchStoveLauncher() / SetLaunchStoveLauncher() | Stove 런처가 실행 중이 아닐 때 런처를 실행할지 여부예요. |
PlatformName | const wchar_t* | 읽기·쓰기 | Stove_IStoveRestartAppIfNecessaryParam_GetPlatformName() / SetPlatformName() | 플랫폼 이름이에요. 선택 필드이며 스토브 외 플랫폼(Steam 등)과 함께 연동할 때만 지정해요. 설정하지 않으면 빈 문자열이고, 빈 문자열이나 L"Stove" 는 스토브 단독 연동으로 동작해요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 호출자 (Stove_CreateParam(k_EStoveBaseTypeKind_RestartAppIfNecessaryParam)) |
| 해제 책임 | 호출자 (Destroy() 필수) — API 호출이 끝난 뒤 해제해요. |
Example
IStoveRestartAppIfNecessaryParam* param =
(IStoveRestartAppIfNecessaryParam*)Stove_CreateParam(k_EStoveBaseTypeKind_RestartAppIfNecessaryParam);
Stove_IStoveRestartAppIfNecessaryParam_SetEnvironment(param, L"real");
Stove_IStoveRestartAppIfNecessaryParam_SetGameId(param, L"YOUR_GAME_ID");
Stove_IStoveRestartAppIfNecessaryParam_SetAppKey(param, L"YOUR_APP_KEY");
Stove_IStoveRestartAppIfNecessaryParam_SetLaunchStoveLauncher(param, true);
Stove_RestartAppIfNecessary(param, OnRestartAppIfNecessaryCallback, NULL);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param);
Notes
Stove_RestartAppIfNecessary()는Stove_Initialize()보다 먼저 호출해야 해요. SDK 는 이 호출로 캐시한 Environment/GameId/AppKey 를 이후의Stove_Initialize()에서도 재사용해요.- 과거 인터페이스에서는 Environment/GameId/AppKey 가
IStoveInitializeParam에 있었으나, 현재 인터페이스에서는 이 타입으로 옮겨졌어요.IStoveInitializeParam에는 더 이상 이 필드들이 없어요. PlatformName은 런처와 통신할 IPC 경로를 정하는 데 쓰예요. 값을 비워 두거나L"Stove"를 지정하면 기존과 같은 경로를 사용해요. 런처가 지원하지 않는 임의의 값을 넣으면 경로가 달라져k_EStoveResultCode_IpcConnectFailed(307) 또는k_EStoveResultCode_IpcTimeout(309) 이 발생하므로, 스토브 외 플랫폼 연동 계획이 없다면 설정하지 않아요.
See Also
IStoveResult
종류 구조체 · 모듈 Base · 버전 3.5.0
Description
동기 API 호출의 결과를 담아요. 결과를 생성한 API 를 식별하는 메서드 코드와 결과 코드를 포함해요.
Stove_Initialize(), Stove_GetUser() 등 대부분의 동기 API 가 이 타입을 반환값으로 돌려줘요. 반환된 객체는 사용 후 Destroy() 로 해제해야 해요.
Declaration
typedef struct IStoveResult IStoveResult;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
MethodCode | uint32_t | 읽기 | Stove_IStoveResult_GetMethodCode() | 이 결과를 생성한 API 를 식별하는 전역 고유 메서드 코드예요. 모듈을 1000 단위 블록으로 인코딩해요(모듈별 EStove<Module>MethodCode 참조). |
ResultCode | uint32_t | 읽기 | Stove_IStoveResult_GetResultCode() | 결과 코드예요. 0(Success)이면 성공, 0이 아니면 실패예요. 공통 코드는 EStoveCommonResultCode(0 ~ 299), 모듈별 코드는 EStoveResultCode(300~)예요. |
IsSuccessful | bool | 읽기 | Stove_IStoveResult_IsSuccessful() | 성공 여부예요(ResultCode 가 0인지와 동일한 판정). |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK (동기 API 호출의 반환값) |
| 해제 책임 | 호출자 (Destroy() 필수) |
Example
IStoveResult* result = Stove_Uninitialize();
if (Stove_IStoveResult_GetResultCode(result) == k_EStoveCommonResultCode_Success)
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
Notes
- 콜백이 아닌 동기 API(
Stove_Initialize,Stove_GetUser등)의 반환값으로 쓰예요. 비동기 API 의 콜백 결과는 IStoveCallbackResult 를 통해 전달돼요. - 결과 코드는 EStoveCommonResultCode(공통, 0 ~ 299) 또는 EStoveResultCode(모듈별, 300~) 값이에요. 과거의 모듈별
EStoveBaseResultCode는 없어졌고EStoveResultCode로 통합되었어요. - flat C 접근 함수에는
Stove_IStoveResult_IsSuccessful()이 있어GetResultCode() == 0판정과 동일한 결과를 즉시 얻을 수 있어요.
See Also
IStoveSendLogParam
종류 구조체 · 모듈 Log · 버전 3.5.0
Description
Stove_SendLog 의 입력 파라미터예요. Stove_CreateParam(k_EStoveLogTypeKind_SendLogParam) 으로 생성한 뒤, 아래 멤버 표의 Setter 로 값을 채우고 호출이 끝나면 해제해요.
값을 모르는 항목은 채우지 않아도 돼요. 숫자 필드는 기본값 0, 문자열 필드는 빈 값/nullptr 로 남아요.
게임이 채워야 하는 값은 이 구조체에 노출된 필드뿐이에요. 디바이스 정보, GDS 정보, 세션 ID, 타임스탬프, 게임 ID·환경 등 나머지 항목은 SDK 가 자동으로 채워 함께 전송해요.
Declaration
typedef struct IStoveSendLogParam IStoveSendLogParam;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
Auid | int64_t | 읽기·쓰기 | Stove_IStoveSendLogParam_GetAuid() / SetAuid() | 계정 UID(STOVE 계정 식별자)예요. |
Cuid | int64_t | 읽기·쓰기 | Stove_IStoveSendLogParam_GetCuid() / SetCuid() | 캐릭터 UID(게임 내 캐릭터 식별자)예요. |
MktType1 | const wchar_t* | 읽기·쓰기 | Stove_IStoveSendLogParam_GetMktType1() / SetMktType1() | 연동된 3rd-party 마케팅 서비스 이름(슬롯 1)이에요. |
MktId1 | const wchar_t* | 읽기·쓰기 | Stove_IStoveSendLogParam_GetMktId1() / SetMktId1() | 슬롯 1 마케팅 서비스가 발급한 식별자(캠페인/리퍼러 ID)예요. |
MktType2 | const wchar_t* | 읽기·쓰기 | Stove_IStoveSendLogParam_GetMktType2() / SetMktType2() | 연동된 3rd-party 마케팅 서비스 이름(슬롯 2)예요. |
MktId2 | const wchar_t* | 읽기·쓰기 | Stove_IStoveSendLogParam_GetMktId2() / SetMktId2() | 슬롯 2 마케팅 서비스가 발급한 식별자예요. |
GameVersion | const wchar_t* | 읽기·쓰기 | Stove_IStoveSendLogParam_GetGameVersion() / SetGameVersion() | 게임 클라이언트 버전 문자열이에요 (예: L"1.2.3"). |
LogGroupId | const wchar_t* | 읽기·쓰기 | Stove_IStoveSendLogParam_GetLogGroupId() / SetLogGroupId() | 서로 연관된 로그 항목 여러 개를 하나의 집합으로 묶는 상관관계 ID예요. |
ServerCode | const wchar_t* | 읽기·쓰기 | Stove_IStoveSendLogParam_GetServerCode() / SetServerCode() | 사용자가 접속한 월드/지역 서버 코드예요. |
ServerCodeDetail | const wchar_t* | 읽기·쓰기 | Stove_IStoveSendLogParam_GetServerCodeDetail() / SetServerCodeDetail() | ServerCode 하위의 서브서버/채널/샤드 등 상세 코드예요. |
LevelCode | const wchar_t* | 읽기·쓰기 | Stove_IStoveSendLogParam_GetLevelCode() / SetLevelCode() | 로그 기록 시점의 계정 레벨 값이에요. |
LevelCodeDetail | const wchar_t* | 읽기·쓰기 | Stove_IStoveSendLogParam_GetLevelCodeDetail() / SetLevelCodeDetail() | 로그 기록 시점의 캐릭터 레벨 값이에요. 이름에 "Detail" 이 붙지만 LevelCode 의 하위 단계가 아니라, 계정 범위인 LevelCode 에 대응하는 캐릭터 범위 값이에요. |
ExternalId | const wchar_t* | 읽기·쓰기 | Stove_IStoveSendLogParam_GetExternalId() / SetExternalId() | 광고 어트리뷰션부터 게임 내 행동까지 연결·추적하는 데 쓰는 식별자예요. Singular(MMP) 연동 게임은 SDID(Singular Device ID)를 전달해요. |
Contents | const wchar_t* | 읽기·쓰기 | Stove_IStoveSendLogParam_GetContents() / SetContents() | 위 필드로 다루지 않는 자유 형식 로그 페이로드예요(보통 wide-string 으로 인코딩한 JSON 문서). 레거시 81plug 의 action_param 필드에 대응해요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 호출자 (Stove_CreateParam(k_EStoveLogTypeKind_SendLogParam)) |
| 해제 책임 | 호출자 (Stove_IStoveTypeBase_Destroy() 필수) — Stove_SendLog() 호출이 반환된 뒤 바로 해제할 수 있어요. |
Example
IStoveSendLogParam* logParam = (IStoveSendLogParam*)Stove_CreateParam(k_EStoveLogTypeKind_SendLogParam);
Stove_IStoveSendLogParam_SetAuid(logParam, auid);
Stove_IStoveSendLogParam_SetCuid(logParam, cuid);
Stove_IStoveSendLogParam_SetContents(logParam, L"{\"event\":\"login\"}");
Stove_SendLog(logParam, OnSendLogFinished, nullptr);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)logParam);
Notes
MktType1/MktId1과MktType2/MktId2는 서로 독립된 두 슬롯이에요. 주(primary)/보조(fallback) 관계가 아니므로, 해당하는 슬롯만 채워요.LevelCodeDetail은 이름과 달리LevelCode의 하위 값이 아니라 캐릭터 범위의 별도 값이에요.Contents는 레거시 81plug 의action_param필드에 대응해요.
See Also
IStoveSetGameProfileParam
종류 구조체 · 모듈 Base · 버전 3.5.0
Description
Stove_SetGameProfile() 호출 시 전달하는 게임 프로필 구조체예요. 게임의 월드 식별자와 월드 내 캐릭터 번호를 담아요.
Stove_CreateParam(k_EStoveBaseTypeKind_SetGameProfileParam) 으로 생성한 뒤 각 필드를 설정하고, 호출이 끝나면 Destroy() 로 해제해요.
Declaration
typedef struct IStoveSetGameProfileParam IStoveSetGameProfileParam;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
WorldId | const wchar_t* | 읽기·쓰기 | Stove_IStoveSetGameProfileParam_GetWorldId() / SetWorldId() | 게임의 월드 식별자예요. |
CharacterNo | int64_t | 읽기·쓰기 | Stove_IStoveSetGameProfileParam_GetCharacterNo() / SetCharacterNo() | 월드 내 캐릭터 번호예요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 호출자 (Stove_CreateParam(k_EStoveBaseTypeKind_SetGameProfileParam)) |
| 해제 책임 | 호출자 (Destroy() 필수) — API 호출이 끝난 뒤 해제해요. |
Example
IStoveSetGameProfileParam* profileParam =
(IStoveSetGameProfileParam*)Stove_CreateParam(k_EStoveBaseTypeKind_SetGameProfileParam);
Stove_IStoveSetGameProfileParam_SetWorldId(profileParam, L"world_01");
Stove_IStoveSetGameProfileParam_SetCharacterNo(profileParam, 12345);
IStoveResult* result = Stove_SetGameProfile(profileParam);
if (Stove_IStoveResult_GetResultCode(result) == k_EStoveCommonResultCode_Success)
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)profileParam);
Notes
- 옛 이름은
StoveGameProfileParams이에요. 옛 구조체에서는CharacterNo필드가 "worldId Length" 로 잘못 표기되어 있었어요 — 실제로는 캐릭터 번호이며, 현재 인터페이스의CharacterNo명칭이 정확한 의미예요.
See Also
IStoveSetPopupDisallowedParam
종류 구조체 · 모듈 View · 버전 3.5.0
Description
IStoveSetPopupDisallowedParam 은 특정 팝업을 일정 기간 다시 노출하지 않도록 지정하는 파라미터 타입이에요. Stove_SetPopupDisallowed 의 입력으로 사용해요.
호출자가 Stove_CreateParam(k_EStoveViewTypeKind_SetPopupDisallowedParam) 으로 생성하고, 값을 채운 뒤 API 호출이 끝나면 Destroy() 로 해제해요.
Declaration
typedef struct IStoveSetPopupDisallowedParam IStoveSetPopupDisallowedParam;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Required | Access | Accessor | Description |
|---|---|---|---|---|---|
PopupId | uint32_t | 예 | 읽기·쓰기 | Stove_IStoveSetPopupDisallowedParam_GetPopupId() / SetPopupId() | 차단할 팝업 식별자예요. |
Days | uint32_t | 예 | 읽기·쓰기 | Stove_IStoveSetPopupDisallowedParam_GetDays() / SetDays() | 팝업을 차단할 기간이에요 (일 단위). 30을 넘는 값을 넣어도 내부적으로 30일로 제한돼요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 호출자 (Stove_CreateParam(k_EStoveViewTypeKind_SetPopupDisallowedParam)) |
| 해제 책임 | 호출자 (Destroy() 필수) |
Example
IStoveSetPopupDisallowedParam* param =
(IStoveSetPopupDisallowedParam*)Stove_CreateParam(k_EStoveViewTypeKind_SetPopupDisallowedParam);
Stove_IStoveSetPopupDisallowedParam_SetPopupId(param, 1001);
Stove_IStoveSetPopupDisallowedParam_SetDays(param, 7);
Stove_SetPopupDisallowed(param, OnSetPopupDisallowedFinished, NULL);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param);
Notes
PopupId·Days를 모두 설정해야 정상적으로 차단 요청을 보낼 수 있어요.Days는 최대 30일까지만 적용돼요. 30보다 큰 값을 넣어도 30일로 제한되어 처리돼요.PopupId는 SDK 호출로 얻는 값이 아니에요.Stove_AutoPopup/Stove_ManualPopup/Stove_NewsPopup/Stove_CouponPopup의 콜백은 팝업 식별자를 반환하지 않으며(콜백의 두 번째 인자는 항상nullptr), 차단 여부는 서버 API 없이 클라이언트 로컬 DB 에만 저장돼요. 따라서 팝업을 등록할 때 부여된 식별자를 게임(스튜디오) 쪽에서 별도로 알고 있어야 이 값을 채울 수 있어요.Stove_SetPopupDisallowed()콜백(OnSetPopupDisallowedCallback)의 두 번째 인자는 항상nullptr인 예약(reserved) 값이에요.
See Also
IStoveShopCategory
종류 구조체 · 모듈 IAP · 버전 3.5.0
Description
상점 카테고리 트리를 구성하는 항목 하나를 나타내요. Stove_FetchShopCategories 호출 결과로 IStoveShopCategoryList 에 담겨 OnFetchShopCategoriesCallback 콜백에 전달돼요.
SDK 가 채워서 콜백으로 전달하는 데이터형이에요. 호출자가 직접 만들지 않아요.
콜백으로 전달되는 목록과 각 항목은 SDK 소유이며 콜백 호출이 끝나면 더 이상 유효하지 않아요.
Destroy()를 호출하지 말고, 보관이 필요한 값은 콜백 안에서 복사해 두어야 해요.
Declaration
typedef struct IStoveShopCategory IStoveShopCategory;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
CategoryId | const wchar_t* | 읽기 | Stove_IStoveShopCategory_GetCategoryId() | 카테고리 식별자 |
CategoryParentId | const wchar_t* | 읽기 | Stove_IStoveShopCategory_GetCategoryParentId() | 상위 카테고리 식별자. 최상위 카테고리는 비어 있어요. |
CategoryDisplayNo | int32_t | 읽기 | Stove_IStoveShopCategory_GetCategoryDisplayNo() | 같은 계층 내에서의 표시 순서 |
CategoryName | const wchar_t* | 읽기 | Stove_IStoveShopCategory_GetCategoryName() | 현지화된 카테고리 이름 |
CategoryDepth | int32_t | 읽기 | Stove_IStoveShopCategory_GetCategoryDepth() | 카테고리 트리에서의 깊이 (0 = 최상위) |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지 — 콜백이 끝나면 무효) |
Example
void __cdecl OnFetchShopCategoriesCallback(const IStoveCallbackResult* callbackResult, const IStoveShopCategoryList* list)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == 0)
{
uint32_t count = Stove_IStoveShopCategoryList_GetCount(list);
for (uint32_t i = 0; i < count; ++i)
{
const IStoveShopCategory* category = Stove_IStoveShopCategoryList_GetAt(list, i);
const wchar_t* categoryId = Stove_IStoveShopCategory_GetCategoryId(category);
const wchar_t* categoryName = Stove_IStoveShopCategory_GetCategoryName(category);
int32_t depth = Stove_IStoveShopCategory_GetCategoryDepth(category);
// 필요한 값만 복사해서 보관해 주세요.
}
// list 와 각 항목은 이 콜백이 끝나면 무효처리됩니다. Destroy() 를 호출하지 마십시오.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Notes
- Stove_FetchShopCategories 의 출력으로만 전달돼요.
CategoryParentId가 비어 있으면 최상위 카테고리예요.- IStoveProduct 의
CategoryId와CategoryName은 이 항목과 대응해요.
See Also
IStoveShopCategoryList
종류 구조체 · 모듈 IAP · 버전 3.5.0
Description
OnFetchShopCategoriesCallback 콜백에 전달되는 컨테이너예요. Stove_FetchShopCategories 가 돌려주는 IStoveShopCategory 배열을 감싸요.
SDK 가 채워서 콜백으로 전달하는 데이터형이에요. 호출자가 직접 만들지 않아요.
이 객체와
GetAt()으로 얻는 각 항목은 모두 SDK 소유이며 콜백 호출이 끝나면 더 이상 유효하지 않아요.Destroy()를 호출하지 말고, 보관이 필요한 값은 콜백 안에서 복사해 두어야 해요.
Declaration
typedef struct IStoveShopCategoryList IStoveShopCategoryList;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
Count | uint32_t | 읽기 | Stove_IStoveShopCategoryList_GetCount() | 결과에 담긴 상점 카테고리 수 |
At(index) | const IStoveShopCategory* | 읽기 | Stove_IStoveShopCategoryList_GetAt() | index(0부터 시작) 위치의 상점 카테고리. index >= Count 이면 nullptr 을 반환해요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지 — 콜백이 끝나면 무효) |
Example
void __cdecl OnFetchShopCategoriesCallback(const IStoveCallbackResult* callbackResult, const IStoveShopCategoryList* list)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == 0)
{
uint32_t count = Stove_IStoveShopCategoryList_GetCount(list);
for (uint32_t i = 0; i < count; ++i)
{
const IStoveShopCategory* category = Stove_IStoveShopCategoryList_GetAt(list, i);
// 필요한 값만 복사해서 보관해 주세요.
}
// list 와 각 항목은 이 콜백이 끝나면 무효처리됩니다. Destroy() 를 호출하지 마십시오.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Notes
- Stove_FetchShopCategories 의 출력으로만 전달돼요.
- 예전에는 배열과 개수를 콜백 인자로 각각 따로 받는 방식이었으나, 지금은 이 컨테이너 하나로 감싸 전달돼요.
See Also
IStoveShutdownInfo
종류 구조체 · 모듈 Base · 버전 3.5.0
Description
Stove_ShutdownNotification() 콜백으로 전달되는 셧다운 고지 정보예요.
셧다운 고지 메시지, 메시지 노출 시간, 셧다운까지 남은 시간을 담아요. SDK 가 만들어 콜백 인자로만 전달하며, 호출자는 해제하지 않아요.
셧다운이 적용된 계정이면 국내뿐 아니라 해외에서도 이 알림이 동작해요.
Declaration
typedef struct IStoveShutdownInfo IStoveShutdownInfo;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
Msg | const wchar_t* | 읽기 | Stove_IStoveShutdownInfo_GetMsg() | 셧다운 고지 메시지예요. |
ExposureTime | int32_t | 읽기 | Stove_IStoveShutdownInfo_GetExposureTime() | 셧다운 메시지 노출 시간(초)예요. |
InadvanceMinutes | int32_t | 읽기 | Stove_IStoveShutdownInfo_GetInadvanceMinutes() | 사용자가 셧다운되기까지 남은 시간(분)이에요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK — 콜백 인자로만 전달되며 콜백이 끝나면 무효처리돼요. 호출자는 Destroy() 를 호출하지 않아요. |
Example
void __cdecl OnShutdownNotificationCallback(const IStoveCallbackResult* callbackResult, const IStoveShutdownInfo* shutdown)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == k_EStoveCommonResultCode_Success)
{
const wchar_t* msg = Stove_IStoveShutdownInfo_GetMsg(shutdown);
int32_t inadvanceMinutes = Stove_IStoveShutdownInfo_GetInadvanceMinutes(shutdown);
// 성공 시 로직을 구현해 주세요. (셧다운 고지 표시)
}
else
{
// 실패 시 로직을 구현해 주세요.
}
// shutdown 은 Destroy() 를 호출하지 않습니다.
}
Notes
ShutdownNotification은 한국 전용이 아니에요. 셧다운이 적용된 계정이면 해외에서도 동작해요.- 이 콜백은 1회성이 아니에요. 서버가 내려준 사전 안내 시점(예: 셧다운 30분 전, 10분 전 등)마다, 그리고 실제 셧다운 시각이 되었을 때 각각 한 번씩 반복 호출돼요.
See Also
IStoveSignin
종류 구조체 · 모듈 Base · 버전 3.5.0
Description
Stove_GetSignin() 호출 시 전달되는 로그인 인증 정보 구조체예요.
본인 인증/이메일 인증 완료 여부와 가입 국가, 가입 시 사용한 인증 방식(IDP) 정보를 담아요. SDK 가 Stove_GetSignin() 의 out 파라미터로 만들어 돌려주며, 호출자가 사용 후 Destroy() 로 해제해요.
Declaration
typedef struct IStoveSignin IStoveSignin;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
IsPersonVerified | bool | 읽기 | Stove_IStoveSignin_IsPersonVerified() | 사용자의 본인 인증 완료 여부예요. |
IsEmailVerified | bool | 읽기 | Stove_IStoveSignin_IsEmailVerified() | 사용자의 이메일 인증 완료 여부예요. |
RegisteredCountryCode | const wchar_t* | 읽기 | Stove_IStoveSignin_GetRegisteredCountryCode() | Stove 플랫폼 가입 국가 코드예요(ISO 3166-1 ALPHA-2). |
ProviderCode | const wchar_t* | 읽기 | Stove_IStoveSignin_GetProviderCode() | Stove 로그인 시 사용한 인증 방식을 나타내는 IDP 분류 코드(문자열)이에요. 예: SO(Stove 이메일), FB(Facebook), GP(Google), STEAM, VTCO 등. |
AccountType | int32_t | 읽기 | Stove_IStoveSignin_GetAccountType() | 계정 유형 코드(숫자, 서버 관리)예요. 예: 2=Facebook, 3=Twitter, 6=Naver, 9=Google+, 11=Stove PC 가입, 12=Apple, 13=LINE, 14=LINE Games, 15=Steam, 16=VTCO 등. 값→의미 매핑이 공개 규격으로 고정되어 있지 않으므로, IDP/계정 종류(예: STEAM vs STEAM_SHADOW)를 식별하려면 ProviderCode 를 대신 참조해요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK (Stove_GetSignin() 의 out 파라미터로 전달) |
| 해제 책임 | 호출자 (Destroy() 필수) |
Example
IStoveSignin* signin = NULL;
IStoveResult* result = Stove_GetSignin(&signin);
if (Stove_IStoveResult_GetResultCode(result) == k_EStoveCommonResultCode_Success)
{
bool personVerified = Stove_IStoveSignin_IsPersonVerified(signin);
const wchar_t* providerCode = Stove_IStoveSignin_GetProviderCode(signin);
// 성공 시 로직을 구현해 주세요.
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)signin);
}
else
{
// 실패 시 로직을 구현해 주세요.
}
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
Notes
Stove_Initialize()로 초기화가 끝난 뒤 호출해야 유효한 값을 받을 수 있어요.AccountType은 숫자 코드,ProviderCode는 문자열 코드로, 같은 인증 방식을 서로 다른 표현으로 나타내요. IDP/계정 종류를 정확히 식별해야 할 때는ProviderCode를 사용해요.
See Also
IStoveStartPurchaseOutcome
종류 구조체 · 모듈 IAP · 버전 3.5.0
Description
Stove_StartPurchase 호출 결과를 나타내요. OnStartPurchaseCallback 콜백에 전달돼요. 어느 필드가 채워지는지는 IStovePurchaseParam 의 Operation 값에 따라 달라져요.
Operation이Default이면TempPaymentUrl이 수동 결제 진행용으로 채워져요.Operation이WithWebViewAndConfirmResult이면 결제가 성공했을 때IsPurchased,PurchasedProduct*,ChargeInfo*가 채워져요.
SDK 가 채워서 콜백으로 전달하는 데이터형이에요. 호출자가 직접 만들지 않아요.
TxnDetailNos가 가리키는 배열,PurchasedProductAt()/ChargeInfoAt()으로 얻는 항목은 모두 SDK 소유이며 콜백 호출이 끝나면 더 이상 유효하지 않아요.Destroy()를 호출하지 말고, 보관이 필요한 값은 콜백 안에서 복사해 두어야 해요.
Declaration
typedef struct IStoveStartPurchaseOutcome IStoveStartPurchaseOutcome;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
TxnMasterNo | int64_t | 읽기 | Stove_IStoveStartPurchaseOutcome_GetTxnMasterNo() | 트랜잭션 마스터 번호 (구매 1건당 TID) |
TxnDetailNos | const int64_t* | 읽기 | Stove_IStoveStartPurchaseOutcome_GetTxnDetailNos() | 상품별 트랜잭션 상세 번호 배열의 포인터. SDK 소유이며 콜백이 끝나면 무효처리돼요. |
TxnDetailNosCount | uint32_t | 읽기 | Stove_IStoveStartPurchaseOutcome_GetTxnDetailNosCount() | TxnDetailNos 가 가리키는 배열의 원소 수 |
TempPaymentUrl | const wchar_t* | 읽기 | Stove_IStoveStartPurchaseOutcome_GetTempPaymentUrl() | 1회용 결제 URL. Operation == Default 일 때 제공돼요. |
PurchaseProgress | EStovePurchaseProgress | 읽기 | Stove_IStoveStartPurchaseOutcome_GetPurchaseProgress() | 구매 진행 상태 |
IsPurchased | bool | 읽기 | Stove_IStoveStartPurchaseOutcome_IsPurchased() | Operation == WithWebViewAndConfirmResult 이고 결제가 성공적으로 완료되었으면 true. 그 외에는 false. |
ExtraData | const wchar_t* | 읽기 | Stove_IStoveStartPurchaseOutcome_GetExtraData() | Stove_StartPurchase 호출 시 전달한 ExtraData 문자열의 에코 |
PurchasedProductCount | uint32_t | 읽기 | Stove_IStoveStartPurchaseOutcome_GetPurchasedProductCount() | 구매된 상품 항목 수. Operation == WithWebViewAndConfirmResult 이고 결제가 성공했을 때 채워져요. |
PurchasedProductAt(index) | const IStovePurchasedProduct* | 읽기 | Stove_IStoveStartPurchaseOutcome_GetPurchasedProductAt() | index(0부터 시작) 위치의 구매 상품 항목. index >= PurchasedProductCount 이면 nullptr 을 반환해요. |
ChargeInfoCount | uint32_t | 읽기 | Stove_IStoveStartPurchaseOutcome_GetChargeInfoCount() | 결제에 사용된 화폐 종류를 설명하는 charge-info 항목 수 |
ChargeInfoAt(index) | const IStoveChargeInfo* | 읽기 | Stove_IStoveStartPurchaseOutcome_GetChargeInfoAt() | index(0부터 시작) 위치의 charge-info 항목. index >= ChargeInfoCount 이면 nullptr 을 반환해요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지 — 콜백이 끝나면 무효) |
Example
void __cdecl OnStartPurchaseCallback(const IStoveCallbackResult* callbackResult, const IStoveStartPurchaseOutcome* outcome)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == 0)
{
int32_t progress = Stove_IStoveStartPurchaseOutcome_GetPurchaseProgress(outcome);
if (progress == k_EStovePurchaseProgress_NeedPaymentWindow)
{
const wchar_t* paymentUrl = Stove_IStoveStartPurchaseOutcome_GetTempPaymentUrl(outcome);
// paymentUrl 을 열어 결제를 진행한 뒤 Stove_ConfirmPurchase() 를 호출해 주세요.
}
else if (Stove_IStoveStartPurchaseOutcome_IsPurchased(outcome))
{
uint32_t productCount = Stove_IStoveStartPurchaseOutcome_GetPurchasedProductCount(outcome);
for (uint32_t i = 0; i < productCount; ++i)
{
const IStovePurchasedProduct* product = Stove_IStoveStartPurchaseOutcome_GetPurchasedProductAt(outcome, i);
// 필요한 값만 복사해서 보관해 주세요.
}
}
// outcome 과 그 안의 배열/항목은 이 콜백이 끝나면 무효처리됩니다. Destroy() 를 호출하지 마십시오.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Notes
- Stove_StartPurchase 의 출력으로만 전달돼요.
PurchaseProgress가NeedPaymentWindow이면TempPaymentUrl로 결제 창을 열고, 결제 후 Stove_ConfirmPurchase 로 구매를 확정해야 해요.ExtraData는 IStoveStartPurchaseParam 의ExtraData를 그대로 반환해요.- 이 타입의 옛 이름은
IStovePurchaseResult이에요(TypeKind 옛 이름:PurchaseResult). 과거 연동을 옮기는 경우 참고해 주세요.
See Also
- Stove_StartPurchase
- Stove_ConfirmPurchase
- IStoveStartPurchaseParam
- IStovePurchasedProduct
- IStoveChargeInfo
IStoveStartPurchaseParam
종류 구조체 · 모듈 IAP · 버전 3.5.0
Description
Stove_StartPurchase 를 호출할 때 전달하는 입력 파라미터예요. 구매할 상품 목록(IStoveOrderProductParam)과 구매 동작 옵션(IStovePurchaseParam)을 함께 담아요.
Stove_CreateParam(k_EStoveIAPTypeKind_StartPurchaseParam) 으로 생성하고, setter 로 값을 채운 뒤 호출이 끝나면 Destroy() 로 해제해야 해요.
Declaration
typedef struct IStoveStartPurchaseParam IStoveStartPurchaseParam;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Required | Accessor | Description |
|---|---|---|---|---|---|
Products | const IStoveOrderProductParam* const* / IStoveOrderProductParam** | 읽기·쓰기 | 예 | Stove_IStoveStartPurchaseParam_GetProducts() / Stove_IStoveStartPurchaseParam_SetProducts() | 구매할 상품별 주문 항목 배열 |
ProductsCount | uint32_t | 읽기 | — | Stove_IStoveStartPurchaseParam_GetProductsCount() | Products 배열의 원소 수. SetProducts() 호출 시 함께 지정돼요. |
PurchaseParam | const IStovePurchaseParam* / IStovePurchaseParam* | 읽기·쓰기 | 예 | Stove_IStoveStartPurchaseParam_GetPurchaseParam() / Stove_IStoveStartPurchaseParam_SetPurchaseParam() | 구매 동작 옵션(웹뷰 배치 포함) |
ServiceTxnNo | const wchar_t* | 읽기·쓰기 | 아니오 | Stove_IStoveStartPurchaseParam_GetServiceTxnNo() / Stove_IStoveStartPurchaseParam_SetServiceTxnNo() | 게임이 발급한 서비스 측 트랜잭션 번호 (선택) |
ExtraData | const wchar_t* | 읽기·쓰기 | 아니오 | Stove_IStoveStartPurchaseParam_GetExtraData() / Stove_IStoveStartPurchaseParam_SetExtraData() | 추가 요청 데이터 (일반적으로 JSON 문자열, 선택). IStoveStartPurchaseOutcome 의 ExtraData 로 그대로 반환돼요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 호출자 (Stove_CreateParam(k_EStoveIAPTypeKind_StartPurchaseParam)) |
| 해제 책임 | 호출자 (Destroy() 필수) |
Example
IStoveOrderProductParam* orderProduct = (IStoveOrderProductParam*)Stove_CreateParam(k_EStoveIAPTypeKind_OrderProductParam);
Stove_IStoveOrderProductParam_SetProductId(orderProduct, productId);
Stove_IStoveOrderProductParam_SetSalePrice(orderProduct, salePrice);
Stove_IStoveOrderProductParam_SetQuantity(orderProduct, 1);
IStovePurchaseParam* purchaseParam = (IStovePurchaseParam*)Stove_CreateParam(k_EStoveIAPTypeKind_PurchaseParam);
Stove_IStovePurchaseParam_SetOperation(purchaseParam, k_EStovePurchaseOperation_WithWebViewAndConfirmResult);
IStoveStartPurchaseParam* startPurchaseParam = (IStoveStartPurchaseParam*)Stove_CreateParam(k_EStoveIAPTypeKind_StartPurchaseParam);
IStoveOrderProductParam* orderProducts[] = { orderProduct };
Stove_IStoveStartPurchaseParam_SetProducts(startPurchaseParam, orderProducts, 1);
Stove_IStoveStartPurchaseParam_SetPurchaseParam(startPurchaseParam, purchaseParam);
Stove_IStoveStartPurchaseParam_SetExtraData(startPurchaseParam, L"{\"orderFrom\":\"shop\"}");
Stove_StartPurchase(startPurchaseParam, OnStartPurchaseCallback, NULL, NULL, NULL);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)startPurchaseParam);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)purchaseParam);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)orderProduct);
Notes
SetProducts()와SetPurchaseParam()은 소유권을 넘겨받지 않아요. 전달한 IStoveOrderProductParam, IStovePurchaseParam 객체는 호출자가 소유권을 유지하며,Stove_StartPurchase()가 반환된 뒤 언제든 각각 직접Destroy()할 수 있어요.Stove_StartPurchase()는 호출이 반환되기 전에 이 자식 객체들의 필요한 값을 모두 동기적으로 복사해 가므로, 비동기 콜백이 실행되는 동안 이 객체들이 참조되지 않아요.Destroy()는 이 파라미터를 구성하는 하위 객체(Products,PurchaseParam)까지 함께 해제하지 않아요. 각 객체를 개별적으로 해제해야 해요.
See Also
- Stove_StartPurchase
- IStoveOrderProductParam
- IStovePurchaseParam
- IStoveStartPurchaseOutcome
- Stove_ConfirmPurchase
IStoveTermsAgreementOutcome
종류 구조체 · 모듈 IAP · 버전 3.5.0
Description
Stove_FetchTermsAgreement 호출 결과를 나타내요. OnFetchTermsAgreementCallback 콜백에 전달돼요.
SDK 가 채워서 콜백으로 전달하는 데이터형이에요. 호출자가 직접 만들지 않아요.
이 객체는 SDK 소유이며 콜백 호출이 끝나면 더 이상 유효하지 않아요.
Destroy()를 호출하지 말고, 보관이 필요한 값은 콜백 안에서 복사해 두어야 해요.
Declaration
typedef struct IStoveTermsAgreementOutcome IStoveTermsAgreementOutcome;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
IsAgreed | bool | 읽기 | Stove_IStoveTermsAgreementOutcome_IsAgreed() | 사용자가 이미 최신 약관에 동의했는지 여부. true 이면 Url 은 빈 문자열이에요. |
Url | const wchar_t* | 읽기 | Stove_IStoveTermsAgreementOutcome_GetUrl() | 호출자가 열어야 하는(또는 웹뷰로 이미 열었던) 약관 페이지 URL. IsAgreed 가 true 이면 비어 있어요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지 — 콜백이 끝나면 무효) |
Example
void __cdecl OnFetchTermsAgreementCallback(const IStoveCallbackResult* callbackResult, const IStoveTermsAgreementOutcome* outcome)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == 0)
{
if (!Stove_IStoveTermsAgreementOutcome_IsAgreed(outcome))
{
const wchar_t* url = Stove_IStoveTermsAgreementOutcome_GetUrl(outcome);
// Operation == Default 이면 url 로 약관 페이지를 직접 열어 주세요.
}
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Notes
- Stove_FetchTermsAgreement 의 출력으로만 전달돼요.
See Also
IStoveTypeBase
종류 구조체 · 모듈 Base · 버전 3.5.0
Description
DLL 경계를 넘어 전달되는 모든 SDK 소유 객체가 상속하는 루트 인터페이스예요. 런타임 타입 식별 기능(GetTypeKind())과 명시적인 Destroy() 해제 방식을 제공해요.
IStoveResult, IStoveUser 뿐 아니라 결제·소유권·통계와 업적·팝업·PC방·로그 등 SDK 가 다루는 모든 객체 타입이 이 인터페이스를 상속해요. 객체를 직접 만드는 일은 없고, 다른 API 가 반환하거나 콜백으로 전달하는 객체의 공통 동작을 정의해요. 해제 책임은 인스턴스마다 ShouldDestroy() 로 확인해요.
ShouldDestroy()가 false 를 반환하는 인스턴스(콜백 인자로 전달된 객체 등)는Destroy()를 호출하면 안 돼요.
Declaration
typedef struct IStoveTypeBase IStoveTypeBase;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
TypeKind | int32_t | 읽기 | Stove_IStoveTypeBase_GetTypeKind() | 구체적인 타입 종류를 반환해요(EStoveBaseTypeKind 값 중 하나). |
ShouldDestroy | bool | 읽기 | Stove_IStoveTypeBase_ShouldDestroy() | 호출자가 이 인스턴스에 대해 Destroy() 를 호출할 책임이 있는지 여부예요. true 면 호출자 소유(반환값 등)이므로 사용 후 정확히 한 번 Destroy() 를 호출해야 하고, false 면 SDK 가 수명을 관리(콜백 인자 등)하므로 Destroy() 를 호출하면 안 돼요. |
| — | void | 동작 | Stove_IStoveTypeBase_Destroy() (Non-const) | 객체를 해제해요. 소유한 인스턴스마다 정확히 한 번만 호출해야 해요. |
QueryExt | void* | 읽기 | Stove_IStoveTypeBase_QueryExt(extId) | 확장 인터페이스 포인터를 반환해요(없으면 nullptr). extId 구간: 0=예약, 1~0xFFFF=이 루트 인터페이스 자체의 향후 확장을 위해 예약된 구간, 0x10000 이상=결제·소유권·통계 등 개별 기능이 정의하는 확장 ID 구간이에요. 현재 SDK 에는 실제로 등록된 확장이 없어 어떤 extId 를 넘겨도 항상 nullptr 을 반환해요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 하위 타입에 따라 달라요 — SDK 가 반환/전달하는 결과·데이터 타입이거나, 호출자가 Stove_CreateParam() 으로 생성하는 파라미터 타입이에요. |
| 해제 책임 | ShouldDestroy() 가 true 를 반환하는 인스턴스는 호출자가 Destroy() 를 호출해요. 콜백 인자로 전달된 인스턴스는 ShouldDestroy() 가 false 이며 해제하지 않아요. |
Example
IStoveResult* result = Stove_Uninitialize();
if (Stove_IStoveTypeBase_ShouldDestroy((IStoveTypeBase*)result))
{
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
}
Notes
IStoveResult,IStoveUser,IStoveGds뿐 아니라 결제·소유권·통계와 업적·팝업·PC방·로그 등 SDK 가 다루는 모든 객체 타입이 이 인터페이스를 상속해요. 이 문서에서 소개하지 않은 다른 구조체도 예외 없이 포함돼요.QueryExt()는 아직 실제로 등록된 확장이 없어, 어떤extId를 넘기더라도 항상nullptr을 반환하는 예약 기능이에요.- 콜백 인자로 전달되는 인스턴스(
IStoveCallbackResult,IStoveAccessToken등)는 콜백이 끝나면 무효처리되므로Destroy()를 호출하지 않아요.
See Also
IStoveUser
종류 구조체 · 모듈 Base · 버전 3.5.0
Description
Stove_GetUser() 호출 시 전달되는 사용자 정보 구조체예요.
런처에서 로그인한 사용자의 닉네임과 게임 사용자 ID 를 담아요. SDK 가 Stove_GetUser() 의 out 파라미터로 만들어 돌려주며, 호출자가 사용 후 Destroy() 로 해제해요.
Declaration
typedef struct IStoveUser IStoveUser;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
NickName | const wchar_t* | 읽기 | Stove_IStoveUser_GetNickName() | 런처에서 로그인한 사용자의 Stove 닉네임이에요. |
UserId | uint64_t | 읽기 | Stove_IStoveUser_GetUserId() | 런처에서 로그인한 사용자의 GameUserId 이에요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK (Stove_GetUser() 의 out 파라미터로 전달) |
| 해제 책임 | 호출자 (Destroy() 필수) |
Example
IStoveUser* user = NULL;
IStoveResult* result = Stove_GetUser(&user);
if (Stove_IStoveResult_GetResultCode(result) == k_EStoveCommonResultCode_Success)
{
const wchar_t* nickName = Stove_IStoveUser_GetNickName(user);
uint64_t userId = Stove_IStoveUser_GetUserId(user);
// 성공 시 로직을 구현해 주세요.
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)user);
}
else
{
// 실패 시 로직을 구현해 주세요.
}
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
Notes
Stove_Initialize()로 초기화가 끝난 뒤 호출해야 유효한 값을 받을 수 있어요.
See Also
IStoveVerifyIdentificationPopupDestroyInfo
종류 구조체 · 모듈 View · 버전 3.5.0
Description
IStoveVerifyIdentificationPopupDestroyInfo 는 본인 인증 팝업이 닫힐 때 전달되는 결과 정보를 담는 타입이에요. Stove_VerifyIdentificationPopup 의 onDestroy 콜백(OnVerifyIdentificationPopupDestroyCallback) 인자로 전달돼요.
이 타입은 SDK 가 만들어 콜백을 통해 전달하며, 호출자가 직접 생성하지 않아요.
Declaration
typedef struct IStoveVerifyIdentificationPopupDestroyInfo IStoveVerifyIdentificationPopupDestroyInfo;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
SimKey | const wchar_t* | 읽기 | Stove_IStoveVerifyIdentificationPopupDestroyInfo_GetSimKey() | 인증 성공 후 발급된 SIM 키예요. 인증에 실패했거나 키를 사용할 수 없는 경우 빈 문자열("")을 반환해요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK (해제 금지. 콜백이 끝나면 무효처리되며, 콜백이 끝난 뒤에는 포인터를 보관하지 않아야 해요) |
Example
void OnVerifyIdentificationPopupDestroyed(const IStoveCallbackResult* callbackResult,
const IStoveVerifyIdentificationPopupDestroyInfo* info)
{
if (Stove_IStoveResult_GetResultCode(Stove_IStoveCallbackResult_GetResult(callbackResult)) == 0 && info != NULL)
{
const wchar_t* simKey = Stove_IStoveVerifyIdentificationPopupDestroyInfo_GetSimKey(info);
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Notes
- 호출자가 직접 생성하지 않으며, Stove_VerifyIdentificationPopup 의
onDestroy콜백을 통해서만 얻을 수 있어요. SimKey가 빈 문자열이면 인증 실패 또는 키 미발급 상태이므로, 값을 사용하기 전에 반드시 확인해야 해요.
See Also
IStoveVerifyIdentificationPopupParam
종류 구조체 · 모듈 View · 버전 3.5.0
Description
IStoveVerifyIdentificationPopupParam 은 본인 인증 팝업(Verify-Identification Popup) 을 표시할 때 사용하는 파라미터 타입이에요. Stove_VerifyIdentificationPopup 의 입력으로 사용해요.
호출자가 Stove_CreateParam(k_EStoveViewTypeKind_VerifyIdentificationPopupParam) 으로 생성하고, 값을 채운 뒤 API 호출이 끝나면 Destroy() 로 해제해요.
Declaration
typedef struct IStoveVerifyIdentificationPopupParam IStoveVerifyIdentificationPopupParam;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Required | Access | Accessor | Description |
|---|---|---|---|---|---|
WebViewMode | int32_t | 예 | 읽기·쓰기 | Stove_IStoveVerifyIdentificationPopupParam_GetWebViewMode() / SetWebViewMode() | 웹뷰 표시 모드예요. EStoveWebViewMode 값(External / Internal)을 담아요. |
CompareIdentifier | bool | 예 | 읽기·쓰기 | Stove_IStoveVerifyIdentificationPopupParam_GetCompareIdentifier() / SetCompareIdentifier() | 인증된 식별자를 현재 로그인한 사용자와 비교할지 여부예요. |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | 호출자 (Stove_CreateParam(k_EStoveViewTypeKind_VerifyIdentificationPopupParam)) |
| 해제 책임 | 호출자 (Destroy() 필수) |
Example
IStoveVerifyIdentificationPopupParam* param =
(IStoveVerifyIdentificationPopupParam*)Stove_CreateParam(k_EStoveViewTypeKind_VerifyIdentificationPopupParam);
Stove_IStoveVerifyIdentificationPopupParam_SetWebViewMode(param, k_EStoveWebViewMode_Internal);
Stove_IStoveVerifyIdentificationPopupParam_SetCompareIdentifier(param, true);
Stove_VerifyIdentificationPopup(param, OnPopupFinished, OnVerifyIdentificationPopupDestroyed, NULL, NULL);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param);
Notes
- 인증이 성공하면 발급된 SIM 키가
onDestroy콜백의 IStoveVerifyIdentificationPopupDestroyInfo 로 전달돼요.
See Also
IStoveVietnamAgeRatingInfo
종류 구조체 · 모듈 Base · 버전 3.5.0
Description
Stove_VietnamAgeRatingNotification() 콜백으로 전달되는 연령등급 고지 오버레이 정보예요. 베트남 전용 API 예요.
오버레이 표시 상태와 형태, 크기/위치, 게임 연령등급, 고지 메시지를 담아요. SDK 가 만들어 콜백 인자로만 전달하며, 호출자는 해제하지 않아요.
1회성 콜백이므로 렌더링이 가능한 시점 이후에 호출해야 해요.
Declaration
typedef struct IStoveVietnamAgeRatingInfo IStoveVietnamAgeRatingInfo;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
OverlayMode | int32_t | 읽기 | Stove_IStoveVietnamAgeRatingInfo_GetOverlayMode() | 오버레이 표시 상태예요(SHOW: 오버레이 표시, HIDE: 오버레이 숨김). EStoveOverlayMode 값이에요. |
OverlayType | int32_t | 읽기 | Stove_IStoveVietnamAgeRatingInfo_GetOverlayType() | 오버레이 유형이에요(0=Black: 어두운 배경(RGB(33,33,33))에 흰 글자, 1=White: 흰 배경(RGB(255,255,255))에 검은 글자, 기본값은 White). |
OverlayScale | float | 읽기 | Stove_IStoveVietnamAgeRatingInfo_GetOverlayScale() | 오버레이 크기 비율이에요(0.0 ~ 1.0). |
OverlayOpacity | float | 읽기 | Stove_IStoveVietnamAgeRatingInfo_GetOverlayOpacity() | 오버레이 불투명도예요(0.0 ~ 1.0). |
AgeRating | int32_t | 읽기 | Stove_IStoveVietnamAgeRatingInfo_GetAgeRating() | 게임 연령등급이에요(0=전체이용가, 12=12세, 16=16세, 18=18세). |
Msg | const wchar_t* | 읽기 | Stove_IStoveVietnamAgeRatingInfo_GetMsg() | 연령등급 고지 메시지예요. |
DisplayPositionX | float | 읽기 | Stove_IStoveVietnamAgeRatingInfo_GetDisplayPositionX() | 메시지 표시 위치의 x 좌표예요. 화면 왼쪽 기준(0.0 ~ 1.0). |
DisplayPositionY | float | 읽기 | Stove_IStoveVietnamAgeRatingInfo_GetDisplayPositionY() | 메시지 표시 위치의 y 좌표예요. 화면 위쪽 기준(0.0 ~ 1.0). |
Language | const wchar_t* | 읽기 | Stove_IStoveVietnamAgeRatingInfo_GetLanguage() | 폰트 선택을 위한 언어 코드예요(예: L"ko", L"en", L"ja", L"vi", L"zh-cn", L"zh-tw", L"th"). |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK — 콜백 인자로만 전달되며 콜백이 끝나면 무효처리돼요. 호출자는 Destroy() 를 호출하지 않아요. |
Example
void __cdecl OnVietnamAgeRatingNotificationCallback(const IStoveCallbackResult* callbackResult, const IStoveVietnamAgeRatingInfo* ageRatingInfo)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == k_EStoveCommonResultCode_Success)
{
int32_t overlayMode = Stove_IStoveVietnamAgeRatingInfo_GetOverlayMode(ageRatingInfo);
const wchar_t* msg = Stove_IStoveVietnamAgeRatingInfo_GetMsg(ageRatingInfo);
// 성공 시 로직을 구현해 주세요. (overlayMode 에 따라 오버레이 표시/숨김)
}
else
{
// 실패 시 로직을 구현해 주세요.
}
// ageRatingInfo 는 Destroy() 를 호출하지 않습니다.
}
Notes
- 베트남 전용 API 이며, 1회성 콜백이므로 렌더링이 가능한 시점 이후에 호출해야 해요.
OverlayMode는 EStoveOverlayMode 값을 사용해요.
See Also
IStoveVietnamOverimmersionInfo
종류 구조체 · 모듈 Base · 버전 3.5.0
Description
Stove_VietnamOverimmersionNotification() 콜백으로 전달되는 과몰입 방지 고지 오버레이 정보예요. 베트남 전용 API 예요.
오버레이 표시 상태와 형태, 크기/위치, 게임 연령등급, 경고 메시지(일반/스타일 적용)를 담아요. SDK 가 만들어 콜백 인자로만 전달하며, 호출자는 해제하지 않아요.
1회성 콜백이므로 렌더링이 가능한 시점 이후에 호출해야 해요.
Declaration
typedef struct IStoveVietnamOverimmersionInfo IStoveVietnamOverimmersionInfo;
// 멤버 접근은 아래 멤버 표의 접근 함수를 사용합니다.
Members
| Name | Type | Access | Accessor | Description |
|---|---|---|---|---|
OverlayMode | int32_t | 읽기 | Stove_IStoveVietnamOverimmersionInfo_GetOverlayMode() | 오버레이 표시 상태예요(SHOW: 오버레이 표시, HIDE: 오버레이 숨김). EStoveOverlayMode 값이에요. |
OverlayType | int32_t | 읽기 | Stove_IStoveVietnamOverimmersionInfo_GetOverlayType() | 오버레이 유형이에요(0=Black: 어두운 배경(RGB(33,33,33))에 흰 글자, 1=White: 흰 배경(RGB(255,255,255))에 검은 글자, 기본값은 White). |
OverlayScale | float | 읽기 | Stove_IStoveVietnamOverimmersionInfo_GetOverlayScale() | 오버레이 크기 비율이에요(0.0 ~ 1.0). |
OverlayOpacity | float | 읽기 | Stove_IStoveVietnamOverimmersionInfo_GetOverlayOpacity() | 오버레이 불투명도예요(0.0 ~ 1.0). |
AgeRating | int32_t | 읽기 | Stove_IStoveVietnamOverimmersionInfo_GetAgeRating() | 게임 연령등급이에요(0=전체이용가, 12=12세, 16=16세, 18=18세). |
Msg | const wchar_t* | 읽기 | Stove_IStoveVietnamOverimmersionInfo_GetMsg() | 과몰입 경고 메시지예요. |
StyledMsg | const wchar_t* | 읽기 | Stove_IStoveVietnamOverimmersionInfo_GetStyledMsg() | <b>, <color=#RRGGBBAA> 등 마크업 태그가 포함된 스타일(번역) 경고 메시지예요. 리치 텍스트 렌더링에 사용해요. |
ElapsedMinutes | int32_t | 읽기 | Stove_IStoveVietnamOverimmersionInfo_GetElapsedMinutes() | 게임 누적 이용 시간(분 단위)예요. |
ExposureTime | int32_t | 읽기 | Stove_IStoveVietnamOverimmersionInfo_GetExposureTime() | 메시지 노출 시간(초)예요. |
ExpandAnimationTime | float | 읽기 | Stove_IStoveVietnamOverimmersionInfo_GetExpandAnimationTime() | Show → Expand 전환 시 오버레이가 확장되는 애니메이션 시간(초)예요. |
DisplayPositionX | float | 읽기 | Stove_IStoveVietnamOverimmersionInfo_GetDisplayPositionX() | 메시지 표시 위치의 x 좌표예요. 화면 왼쪽 기준(0.0 ~ 1.0). |
DisplayPositionY | float | 읽기 | Stove_IStoveVietnamOverimmersionInfo_GetDisplayPositionY() | 메시지 표시 위치의 y 좌표예요. 화면 위쪽 기준(0.0 ~ 1.0). |
Language | const wchar_t* | 읽기 | Stove_IStoveVietnamOverimmersionInfo_GetLanguage() | 폰트 선택을 위한 언어 코드예요(예: L"ko", L"en", L"ja", L"vi", L"zh-cn", L"zh-tw", L"th"). |
Memory Management
| Item | Value |
|---|---|
| 생성 주체 | SDK |
| 해제 책임 | SDK — 콜백 인자로만 전달되며 콜백이 끝나면 무효처리돼요. 호출자는 Destroy() 를 호출하지 않아요. |
Example
void __cdecl OnVietnamOverimmersionNotificationCallback(const IStoveCallbackResult* callbackResult, const IStoveVietnamOverimmersionInfo* overimmersionInfo)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_GetResultCode(result) == k_EStoveCommonResultCode_Success)
{
int32_t overlayMode = Stove_IStoveVietnamOverimmersionInfo_GetOverlayMode(overimmersionInfo);
const wchar_t* styledMsg = Stove_IStoveVietnamOverimmersionInfo_GetStyledMsg(overimmersionInfo);
// 성공 시 로직을 구현해 주세요. (overlayMode 에 따라 오버레이 표시/숨김/확장)
}
else
{
// 실패 시 로직을 구현해 주세요.
}
// overimmersionInfo 는 Destroy() 를 호출하지 않습니다.
}
Notes
- 베트남 전용 API 이며, 1회성 콜백이므로 렌더링이 가능한 시점 이후에 호출해야 해요.
OverlayMode는 EStoveOverlayMode 값을 사용하며,k_EStoveOverlayMode_Expanded(확장 표시)도 지원해요.ElapsedMinutes단위는 분(minute)예요. 시간(hour) 단위인 IStoveOverImmersionInfo 의ElapsedHours와 혼동하지 않도록 주의해요.
See Also
IStoveWebViewLayoutParam
종류 구조체 · 모듈 IAP · 버전 3.5.0
Description
IStovePurchaseParam, IStoveFetchTermsAgreementParam, IStoveWithdrawGameParam 세 파라미터 타입이 공통으로 상속하는 웹뷰 배치 필드 모음이에요.
이 타입은 Stove_CreateParam() 으로 단독 생성할 수 있는 종류가 아니에요(대응하는 EStoveIAPTypeKind 값이 없어요). 항상 위 세 구체 타입 중 하나의 베이스로만 존재하며, 값을 읽고 쓸 때도 구체 타입 각각의 flat 접근 함수(예: Stove_IStovePurchaseParam_GetWebViewMode())를 사용해요. Stove_IStoveWebViewLayoutParam_* 형태의 접근 함수는 없어요.
Declaration
// 추상 공유 베이스입니다. 단독 typedef 나 Stove_CreateParam() 대상이 아닙니다.
// 실제 사용은 아래 구체 타입 문서를 참고해 주세요.
Members
| Name | Type | Description |
|---|---|---|
WebViewMode | EStoveWebViewMode | 웹뷰 표시 모드 (외부 브라우저 / SDK 내장 웹뷰) |
WebViewPosX | int32_t | 웹뷰 x 좌표 (픽셀) |
WebViewPosY | int32_t | 웹뷰 y 좌표 (픽셀) |
WebViewWidth | int32_t | 웹뷰 너비 (픽셀) |
WebViewHeight | int32_t | 웹뷰 높이 (픽셀) |
이 멤버들에 대한 접근 함수·필수 여부는 실제로 사용하는 구체 타입 문서(IStovePurchaseParam, IStoveFetchTermsAgreementParam, IStoveWithdrawGameParam)의 멤버 표를 참고해 주세요.
Memory Management
이 타입은 단독으로 생성·해제되지 않아요. 항상 구체 타입(IStovePurchaseParam 등)의 일부로 함께 생성되고 해제돼요. 해제 방법은 각 구체 타입 문서를 참고해 주세요.
Example
// IStoveWebViewLayoutParam 은 직접 생성하지 않습니다.
// 아래처럼 구체 타입을 통해 상속된 필드를 사용합니다.
IStovePurchaseParam* purchaseParam = (IStovePurchaseParam*)Stove_CreateParam(k_EStoveIAPTypeKind_PurchaseParam);
Stove_IStovePurchaseParam_SetWebViewMode(purchaseParam, k_EStoveWebViewMode_Internal);
Stove_IStovePurchaseParam_SetWebViewWidth(purchaseParam, 480);
Stove_IStovePurchaseParam_SetWebViewHeight(purchaseParam, 640);
Notes
IStovePurchaseParam,IStoveFetchTermsAgreementParam에서는 이 필드들이 각 타입의Operation값이Default가 아닐 때만 적용돼요.IStoveWithdrawGameParam에는Operation이 없어 이 필드들이 항상 적용돼요.
See Also
- IStovePurchaseParam
- IStoveFetchTermsAgreementParam
- IStoveWithdrawGameParam
- EStoveWebViewMode
Stove_AccessTokenRenewed
종류 함수 · 모듈 Base · 버전 3.5.0
Description
AccessToken이 갱신될 때 새로 발급된 토큰을 콜백으로 전달해요. 토큰이 갱신되는 시점에 맞춰 별도 작업이 필요할 때 사용해요.
Declaration
void Stove_AccessTokenRenewed(const IStoveTypeBase* param, OnAccessTokenRenewedCallback onFinished, void* userData);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IStoveTypeBase* | N | 예약된 인자로, 전용 ...Param TypeKind는 정의되어 있지 않아요. |
onFinished | OnAccessTokenRenewedCallback | Y | 결과를 받을 콜백이에요. |
userData | void* | N | 콜백에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnAccessTokenRenewedCallback)(const IStoveCallbackResult* callbackResult, const IStoveAccessToken* token);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
token | const IStoveAccessToken* | 새로 발급된 토큰 정보예요. Stove_IStoveAccessToken_GetAccessToken(), Stove_IStoveAccessToken_GetExpireIn()으로 조회해요. |
콜백은 Stove_RunCallback()을 호출한 스레드에서 실행돼요. AccessToken이 갱신될 때마다 반복해서 전달돼요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | onFinished가 nullptr이에요. | x | |
| 16 | k_EStoveCommonResultCode_BaseNotInitialized | 초기화되지 않은 상태에서 호출했어요. | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 알 수 없는 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
하위 계층(토큰 처리 로직)에서 k_EStoveResultCode_RenewTokenMaxRetryCountExceeded(306) 또는 k_EStoveCommonResultCode_Fail(1)이 전달될 수 있어요.
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | 전달했다면 Stove_IStoveTypeBase_Destroy() 필수 |
콜백의 callbackResult, token | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요 |
Example
Stove_AccessTokenRenewed(nullptr, [](const IStoveCallbackResult* callbackResult, const IStoveAccessToken* token)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
const wchar_t* newAccessToken = Stove_IStoveAccessToken_GetAccessToken(token);
int32_t expireIn = Stove_IStoveAccessToken_GetExpireIn(token);
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}, nullptr);
Notes
- 토큰이 갱신될 때마다 반복해서 호출되는 콜백이에요. 1회성 콜백이 아니에요.
- 매번 최신 토큰이 필요하지 않다면 Stove_GetAccessToken으로 그때그때 조회해도 돼요.
See Also
Stove_AutoPopup
종류 함수 · 모듈 View · 버전 3.5.0
Description
이 함수는 서버에서 자동으로 내려주는 팝업 목록을 조회하여 오토 팝업(공지·이벤트 등을 별도 호출 시점 지정 없이 자동으로 띄우는 팝업)을 웹뷰로 표시해요. 표시할 팝업이 없으면 실패로 처리돼요.
SDK 초기화(Stove_Initialize()) 이후에 호출해야 해요.
Declaration
void Stove_AutoPopup(const IStovePopupParam* param,
OnViewPopupCallback onFinished, OnViewPopupDestroyCallback onDestroy,
void* userData1, void* userData2);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IStovePopupParam* | Y | 오토 팝업 표시에 사용할 파라미터예요(웹뷰 표시 모드). |
onFinished | OnViewPopupCallback | Y | 팝업 생성 결과를 전달받을 콜백이에요. |
onDestroy | OnViewPopupDestroyCallback | N | 팝업(웹뷰)이 닫힌 뒤 전달받을 콜백이에요. 생략하면 결과를 받을 수 없어요. |
userData1 | void* | N | onFinished 에 그대로 전달되는 사용자 데이터예요. |
userData2 | void* | N | onDestroy 에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnViewPopupCallback)(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved);
typedef void(__cdecl* OnViewPopupDestroyCallback)(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
reserved | const IStoveTypeBase* | 예약된 인자예요. 현재 구현에서는 항상 nullptr 로 전달돼요. |
두 콜백 모두 Stove_RunCallback() 을 호출한 스레드에서 실행돼요.
onFinished는 팝업 생성 결과에 대해 1회 전달돼요.onDestroy는 웹뷰가 완전히 닫힌 뒤 1회 전달돼요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 17 | k_EStoveCommonResultCode_NotInitialized | SDK 가 초기화되지 않았어요 | x | |
| 60 | k_EStoveCommonResultCode_ViewUiNotInitialized | View UI 서브시스템이 초기화되지 않았어요(방어적 코드 경로로, 정상 흐름에서는 발생하지 않아요) | x | |
| 62 | k_EStoveCommonResultCode_WebviewCreateFail | 웹뷰 생성에 실패했어요(팝업이 여러 개일 때 일부만 생성 실패한 경우 포함) | x | |
| 63 | k_EStoveCommonResultCode_WebviewLoadUrlFail | 웹뷰에서 URL 로드에 실패했어요 | x | |
| 65 | k_EStoveCommonResultCode_WebviewCloseAllFail | 팝업 생성 전 기존 웹뷰를 일괄 닫는 데 실패했어요 | x | |
| 66 | k_EStoveCommonResultCode_WebviewCloseFail | onDestroy 시점에 웹뷰가 정상적으로 닫히지 않았어요 | x | |
| 67 | k_EStoveCommonResultCode_NoPopupData | 표시할 오토 팝업 데이터가 없어요 | O | 팝업 설정 정보가 존재하지 않아 표시할 창이 없습니다. [확인] |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 관리되지 않는 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 관리되는 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param) 필수. Stove_AutoPopup() 호출이 끝나면 곧바로 해제할 수 있어요. |
콜백의 callbackResult | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
콜백의 reserved | SDK(항상 nullptr) | 해제 금지. |
Example
void __cdecl OnAutoPopupFinished(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
void __cdecl OnAutoPopupDestroyed(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
IStovePopupParam* param =
(IStovePopupParam*)Stove_CreateParam(k_EStoveViewTypeKind_PopupParam);
Stove_IStovePopupParam_SetWebViewMode(param, k_EStoveWebViewMode_Internal);
Stove_AutoPopup(param, OnAutoPopupFinished, OnAutoPopupDestroyed, nullptr, nullptr);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param);
// 게임 루프 안에서 반복 호출해야 콜백이 실행됩니다.
while (isGameRunning)
{
Stove_RunCallback();
}
Notes
- 이 함수는 비동기 함수이며, 두 콜백은
Stove_RunCallback()을 호출하는 스레드에서 실행돼요. - 웹뷰가 아예 만들어지지 못하고 호출이 조기 종료되는 경우(예: 미초기화), 실패 사유는
onFinished로만 전달돼요. 이 경우onDestroy는 호출되지 않으므로,onDestroy가 오지 않았다고 해서 웹뷰가 아직 열려 있다고 판단해서는 안 돼요. - 팝업 생성 전 기존 웹뷰를 일괄 닫는 단계가 실패하면 65(
WebviewCloseAllFail)를 반환해요.onDestroy시점에 웹뷰가 정상적으로 닫히지 않으면 66(WebviewCloseFail)을 반환해요. - 여러 팝업 API를 동시에 호출하지 않도록 주의해야 해요.
See Also
- IStovePopupParam
- Stove_ManualPopup
- Stove_NewsPopup
- Stove_CouponPopup
- Stove_SetPopupDisallowed
- EStoveWebViewMode
Stove_CloseAllPopups
종류 함수 · 모듈 Base · 버전 3.5.0
Description
SDK가 띄운 모든 팝업을 닫아요. IAP 팝업과 View 팝업이 모두 대상이에요.
단일바이너리(BaseSDK Consolidation) 통합 이후, 모듈별로 따로 있던
Stove_IAP_CloseAllPopups()/Stove_View_CloseAllPopups()를 이 함수 하나로 대체해요. 이제 한 번의 호출로 SDK의 모든 팝업이 함께 닫혀요.
Declaration
IStoveResult* Stove_CloseAllPopups();
Parameters
없음
Returns
| Type | Description |
|---|---|
IStoveResult* | 호출 결과예요. Stove_IStoveResult_IsSuccessful(result)이면 성공이에요. |
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공(IAP · View 팝업 닫기 모두 성공) | x | |
| 68 | k_EStoveCommonResultCode_CloseAllPopupsFailed | IAP 또는 View 중 하나 이상의 팝업 닫기 처리가 실패함(구체적인 원인 코드는 이 값 하나로 정규화되어 노출되지 않음) | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 알 수 없는 예외가 발생함 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 내부 예외가 발생함 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
이 함수는 내부적으로 IAP 모듈과 View 모듈의 팝업 닫기를 항상 모두 수행해요. 두 결과 중 하나라도 실패했다면(IAP 우선 검사) 그 결과를 채택하고, 채택된 결과 코드가 성공(0) · UnmanagedException(253) · ManagedException(254) 이 아닌 그 외의 모든 실패는 CloseAllPopupsFailed(68) 하나로 정규화되어 반환돼요. 즉 View · IAP 각 모듈이 실제로 어떤 원인으로 실패했는지(예: 웹뷰 미초기화, 팝업 데이터 없음 등)는 이 함수의 반환값만으로는 구분할 수 없어요.
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
반환된 IStoveResult* | 호출자 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result) 필수 |
Example
IStoveResult* result = Stove_CloseAllPopups();
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
Notes
- 단일바이너리 통합 이후 IAP 팝업과 View 팝업을 한 번의 호출로 모두 닫아요. 두 모듈 모두 항상 시도되며, 실패 시 반환되는 결과 코드는
CloseAllPopupsFailed(68) 하나로 정규화돼요. - 이 함수는 동기 함수이며 콜백을 받지 않아요.
Stove_ConfirmPurchase
종류 함수 · 모듈 IAP · 버전 3.5.0
Description
Stove_StartPurchase의 Operation(EStovePurchaseOperation) 값이 WithWebViewAndConfirmResult가 아닌 경우, 결제 완료 후 이 함수를 호출해 구매를 확정해요. param에는 Stove_StartPurchase 결과로 받은 IStoveStartPurchaseOutcome::GetTxnMasterNo() 값을 설정해요.
확정 결과는 onFinished 콜백으로 전달되며, 확정 여부와 함께 구매한 상품 목록·결제에 사용된 화폐(차지) 정보가 함께 전달돼요.
Declaration
void Stove_ConfirmPurchase(const IStoveConfirmPurchaseParam* param, OnConfirmPurchaseCallback onFinished, void* userData);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IStoveConfirmPurchaseParam* | Y | 확정할 거래의 마스터 번호(TxnMasterNo) 파라미터예요. |
onFinished | OnConfirmPurchaseCallback | Y | 확정 결과를 받을 콜백이에요. |
userData | void* | N | 콜백에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnConfirmPurchaseCallback)(const IStoveCallbackResult* callbackResult, const IStoveConfirmPurchaseOutcome* outcome);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
outcome | const IStoveConfirmPurchaseOutcome* | 확정 결과예요. Stove_IStoveConfirmPurchaseOutcome_IsConfirmed()로 최종 확정 여부를, GetPurchasedProductCount()/GetPurchasedProductAt(), GetChargeInfoCount()/GetChargeInfoAt()로 구매 상품·화폐 정보를 조회해요. |
콜백은 Stove_RunCallback()을 호출한 스레드에서 실행돼요. 호출 1건당 1회만 전달돼요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 17 | k_EStoveCommonResultCode_NotInitialized | 결제 기능이 초기화되지 않았어요. | x | |
| 21 | k_EStoveCommonResultCode_NullEntity | 표시 언어 정보가 준비되지 않았어요(Stove_SetLanguage 호출 여부 확인). | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 관리되지 않는 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 관리되는 예외가 발생했어요(로그인 토큰 등 내부 엔티티 누락 포함). | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
네트워크/서버 응답 오류는 하위 HTTP 계층에서 전달돼요.
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param) 필수. 호출이 반환된 뒤 해제해요. |
콜백의 callbackResult | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
콜백의 outcome(및 그 안의 각 IStovePurchasedProduct, IStoveChargeInfo) | SDK | 해제 금지. 콜백이 끝나면 무효처리되며, 필요한 값은 콜백 안에서 복사해 두어야 해요. |
Example
void __cdecl OnConfirmPurchaseFinished(const IStoveCallbackResult* callbackResult, const IStoveConfirmPurchaseOutcome* outcome)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result) && Stove_IStoveConfirmPurchaseOutcome_IsConfirmed(outcome))
{
// 성공 시 로직을 구현해 주세요.
uint32_t count = Stove_IStoveConfirmPurchaseOutcome_GetPurchasedProductCount(outcome);
for (uint32_t i = 0; i < count; ++i)
{
const IStovePurchasedProduct* purchasedProduct = Stove_IStoveConfirmPurchaseOutcome_GetPurchasedProductAt(outcome, i);
int64_t productId = Stove_IStovePurchasedProduct_GetProductId(purchasedProduct);
}
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
// 호출 (txnMasterNo 는 Stove_StartPurchase() 결과의 IStoveStartPurchaseOutcome::GetTxnMasterNo() 값)
IStoveConfirmPurchaseParam* param = (IStoveConfirmPurchaseParam*)Stove_CreateParam(k_EStoveIAPTypeKind_ConfirmPurchaseParam);
Stove_IStoveConfirmPurchaseParam_SetTxnMasterNo(param, txnMasterNo);
Stove_ConfirmPurchase(param, OnConfirmPurchaseFinished, nullptr);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param);
Notes
- 이 함수는 비동기 함수이며 결과는
onFinished콜백으로만 전달돼요. - Stove_StartPurchase의
Operation이WithWebViewAndConfirmResult인 경우에는 SDK가 이 함수를 자동으로 호출하므로 별도로 호출할 필요가 없어요. callbackResult의 성공 여부와outcome의IsConfirmed()는 별개예요. 호출 자체가 성공했더라도IsConfirmed()가false이면 구매가 최종 확정되지 않은 상태예요.- 옛 인터페이스에서는 이 결과가
status·purchasedProducts·chargeInfos등 개별 인자로 전달되었어요. 현재는 이를 감싼IStoveConfirmPurchaseOutcome하나로 전달돼요.
See Also
Stove_CouponPopup
종류 함수 · 모듈 View · 버전 3.5.0
Description
이 함수는 서버에서 내려주는 쿠폰 팝업 목록을 조회하여 웹뷰로 표시해요.
SDK 초기화(Stove_Initialize()) 이후, 그리고 게임 서버(월드)에 접속한 상태에서 호출해야 해요.
게임 클라이언트가 아직 게임 서버(월드)에 접속하지 않은 상태(내부적으로 관리되는 월드 ID 가 비어 있는 상태)에서 호출하면
k_EStoveCommonResultCode_InvalidParam(5)으로 실패해요.
Declaration
void Stove_CouponPopup(const IStovePopupParam* param,
OnViewPopupCallback onFinished, OnViewPopupDestroyCallback onDestroy,
void* userData1, void* userData2);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IStovePopupParam* | Y | 쿠폰 팝업 표시에 사용할 파라미터예요(웹뷰 표시 모드). |
onFinished | OnViewPopupCallback | Y | 팝업 생성 결과를 전달받을 콜백이에요. |
onDestroy | OnViewPopupDestroyCallback | N | 팝업(웹뷰)이 닫힌 뒤 전달받을 콜백이에요. 생략하면 결과를 받을 수 없어요. |
userData1 | void* | N | onFinished 에 그대로 전달되는 사용자 데이터예요. |
userData2 | void* | N | onDestroy 에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnViewPopupCallback)(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved);
typedef void(__cdecl* OnViewPopupDestroyCallback)(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
reserved | const IStoveTypeBase* | 예약된 인자예요. 현재 구현에서는 항상 nullptr 로 전달돼요. |
두 콜백 모두 Stove_RunCallback() 을 호출한 스레드에서 실행돼요.
onFinished는 팝업 생성 결과에 대해 1회 전달돼요.onDestroy는 웹뷰가 완전히 닫힌 뒤 1회 전달돼요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | 게임 서버(월드)에 접속하지 않은 상태예요 | x | |
| 17 | k_EStoveCommonResultCode_NotInitialized | SDK 가 초기화되지 않았어요 | x | |
| 60 | k_EStoveCommonResultCode_ViewUiNotInitialized | View UI 서브시스템이 초기화되지 않았어요(방어적 코드 경로로, 정상 흐름에서는 발생하지 않아요) | x | |
| 62 | k_EStoveCommonResultCode_WebviewCreateFail | 웹뷰 생성에 실패했어요(팝업이 여러 개일 때 일부만 생성 실패한 경우 포함) | x | |
| 63 | k_EStoveCommonResultCode_WebviewLoadUrlFail | 웹뷰에서 URL 로드에 실패했어요 | x | |
| 65 | k_EStoveCommonResultCode_WebviewCloseAllFail | 팝업 생성 전 기존 웹뷰를 일괄 닫는 데 실패했어요 | x | |
| 66 | k_EStoveCommonResultCode_WebviewCloseFail | onDestroy 시점에 웹뷰가 정상적으로 닫히지 않았어요 | x | |
| 67 | k_EStoveCommonResultCode_NoPopupData | 표시할 쿠폰 팝업 데이터가 없어요 | O | 팝업 설정 정보가 존재하지 않아 표시할 창이 없습니다. [확인] |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 관리되지 않는 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 관리되는 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param) 필수. Stove_CouponPopup() 호출이 끝나면 곧바로 해제할 수 있어요. |
콜백의 callbackResult | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
콜백의 reserved | SDK(항상 nullptr) | 해제 금지. |
Example
void __cdecl OnCouponPopupFinished(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
void __cdecl OnCouponPopupDestroyed(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
IStovePopupParam* param =
(IStovePopupParam*)Stove_CreateParam(k_EStoveViewTypeKind_PopupParam);
Stove_IStovePopupParam_SetWebViewMode(param, k_EStoveWebViewMode_Internal);
Stove_CouponPopup(param, OnCouponPopupFinished, OnCouponPopupDestroyed, nullptr, nullptr);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param);
// 게임 루프 안에서 반복 호출해야 콜백이 실행됩니다.
while (isGameRunning)
{
Stove_RunCallback();
}
Notes
- 이 함수는 비동기 함수이며, 두 콜백은
Stove_RunCallback()을 호출하는 스레드에서 실행돼요. - 웹뷰가 아예 만들어지지 못하고 호출이 조기 종료되는 경우(예: 미초기화, 게임 서버 미접속), 실패 사유는
onFinished로만 전달돼요. 이 경우onDestroy는 호출되지 않으므로,onDestroy가 오지 않았다고 해서 웹뷰가 아직 열려 있다고 판단해서는 안 돼요. Stove_CouponPopup은 5개 팝업 API(오토·수동·뉴스·쿠폰·본인인증) 중 게임 서버(월드) 접속 여부를 검증해k_EStoveCommonResultCode_InvalidParam(5)을 반환하는 유일한 API예요. 이 검증값은 IStovePopupParam 의 필드가 아니라 SDK 내부에서 관리하는 월드 접속 상태를 기준으로 해요.- 특정 팝업을 일정 기간 다시 표시하지 않게 하려면 Stove_SetPopupDisallowed 를 사용해요.
See Also
Stove_CreateParam
종류 함수 · 모듈 Base · 버전 3.5.0
Description
Stove_CreateParam은 SDK의 모든 모듈이 공유하는 단일 객체 생성 창구예요. kind로 전달한 값에 대응하는 IStoveTypeBase 파생 객체를 생성해서 돌려줘요.
kind에는 모듈에 상관없이 아무 EStove*TypeKind 값이나 전달할 수 있어요. 각 모듈의 TypeKind 열거형은 정수 범위가 서로 겹치지 않게 나뉘어 있어서, 이 함수 하나로 어떤 모듈의 타입이든 구분해서 생성할 수 있어요(예: k_EStoveBaseTypeKind_InitializeParam, k_EStoveIAPTypeKind_FetchProductsParam). 다만 각 모듈의 ...Param 계열 TypeKind만 유효한 값이며, 결과/데이터 계열(Outcome·Info·List) TypeKind나 알 수 없는 값을 전달해도 오류로 처리되지 않고 nullptr을 반환해요.
단일바이너리(BaseSDK Consolidation) 통합 이후, 모듈별로 따로 있던
Stove_<Module>CreateParam()팩토리 함수들이 이 함수 하나로 대체되었어요.
Declaration
IStoveTypeBase* Stove_CreateParam(int kind);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
kind | int | Y | 생성할 객체의 종류를 지정하는 EStove*TypeKind 값이에요. Base 모듈의 경우 EStoveBaseTypeKind의 ...Param 계열 값(예: k_EStoveBaseTypeKind_InitializeParam)을 전달해요. |
Returns
| Type | Description |
|---|---|
IStoveTypeBase* | 생성된 객체 포인터예요. kind 값이 ...Param 계열이 아니거나 알 수 없으면 nullptr을 반환해요. 항상 nullptr 여부를 확인한 뒤, 요청한 타입으로 캐스팅해서 사용해요(예: (IStoveInitializeParam*)). |
Error Codes
없음. 이 함수는 IStoveResult를 반환하지 않는 순수 팩토리 함수이며, 실패는 반환값이 nullptr인지로만 판단해요. 개별 오류코드는 존재하지 않아요.
Memory Management
| Object | Owner | Release |
|---|---|---|
반환된 IStoveTypeBase* | 호출자 | Stove_IStoveTypeBase_Destroy() 필수 |
Example
IStoveTypeBase* base = Stove_CreateParam(k_EStoveBaseTypeKind_InitializeParam);
if (base != nullptr)
{
IStoveInitializeParam* initParam = (IStoveInitializeParam*)base;
Stove_IStoveInitializeParam_SetShopKey(initParam, L"YOUR_SHOP_KEY");
Stove_IStoveInitializeParam_SetMainWndHandle(initParam, hWnd);
// initParam을 사용한 뒤에는 반드시 Destroy 합니다.
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)initParam);
}
else
{
// kind 값이 잘못되었을 때의 처리 로직을 구현해 주세요.
}
Notes
kind에 어떤 값을 넣을 수 있는지는 각 모듈의 TypeKind 문서를 참조해요. Base 모듈은 EStoveBaseTypeKind를 참조해요.- 이 함수로 생성한 객체는 모두 사용 후
Stove_IStoveTypeBase_Destroy()로 해제해야 해요.
See Also
Stove_FetchInventory
종류 함수 · 모듈 IAP · 버전 3.5.0
Description
현재 로그인한 사용자의 구매 내역을 조회해요. 조회된 인벤토리 항목 목록은 onFinished 콜백으로 IStoveInventoryList 형태로 전달돼요.
Declaration
void Stove_FetchInventory(const IStoveTypeBase* param, OnFetchInventoryCallback onFinished, void* userData);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IStoveTypeBase* | N | 예약된 매개변수예요. 현재 사용되지 않으므로 항상 nullptr을 전달해요. |
onFinished | OnFetchInventoryCallback | Y | 인벤토리 항목 목록을 받을 콜백이에요. |
userData | void* | N | 콜백에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnFetchInventoryCallback)(const IStoveCallbackResult* callbackResult, const IStoveInventoryList* list);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
list | const IStoveInventoryList* | 조회된 인벤토리 항목 목록이에요. Stove_IStoveInventoryList_GetCount() / Stove_IStoveInventoryList_GetAt()으로 순회해요. |
콜백은 Stove_RunCallback()을 호출한 스레드에서 실행돼요. 호출 1건당 1회만 전달돼요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 17 | k_EStoveCommonResultCode_NotInitialized | 결제 기능이 초기화되지 않았어요. | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 관리되지 않는 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 관리되는 예외가 발생했어요(로그인 토큰 등 내부 엔티티 누락 포함). | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
네트워크/서버 응답 오류는 하위 HTTP 계층에서 전달돼요.
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | 현재 사용되지 않는 예약 매개변수이므로 해제할 대상이 없어요. |
콜백의 callbackResult | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
콜백의 list(및 그 안의 각 IStoveInventoryItem) | SDK | 해제 금지. 콜백이 끝나면 무효처리되며, 필요한 값은 콜백 안에서 복사해 두어야 해요. |
Example
void __cdecl OnFetchInventoryFinished(const IStoveCallbackResult* callbackResult, const IStoveInventoryList* list)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
uint32_t count = Stove_IStoveInventoryList_GetCount(list);
for (uint32_t i = 0; i < count; ++i)
{
const IStoveInventoryItem* item = Stove_IStoveInventoryList_GetAt(list, i);
const wchar_t* productName = Stove_IStoveInventoryItem_GetProductName(item);
}
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
// 호출
Stove_FetchInventory(nullptr, OnFetchInventoryFinished, nullptr);
Notes
- 이 함수는 비동기 함수이며 결과는
onFinished콜백으로만 전달돼요. param은 현재 사용되지 않는 예약 매개변수이므로 항상nullptr을 전달해요.
See Also
Stove_FetchProducts
종류 함수 · 모듈 IAP · 버전 3.5.0
Description
params로 전달한 카테고리 ID와 페이지 조건에 맞는 상품 목록을 조회해요. 조회된 상품 목록은 onFinished 콜백으로 IStoveProductList 형태로 전달돼요.
카테고리 ID를 비워두면 전체 카테고리의 상품을 조회해요. 특정 카테고리의 상품만 조회하려면 Stove_FetchShopCategories로 얻은 CategoryId를 필터로 지정해요.
Declaration
void Stove_FetchProducts(const IStoveFetchProductsParam* params, OnFetchProductsCallback onFinished, void* userData);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
params | const IStoveFetchProductsParam* | Y | 카테고리 필터·페이지 조건 파라미터예요. |
onFinished | OnFetchProductsCallback | Y | 상품 목록을 받을 콜백이에요. |
userData | void* | N | 콜백에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnFetchProductsCallback)(const IStoveCallbackResult* callbackResult, const IStoveProductList* list);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
list | const IStoveProductList* | 조회된 상품 목록이에요. Stove_IStoveProductList_GetCount() / Stove_IStoveProductList_GetAt()으로 순회해요. |
콜백은 Stove_RunCallback()을 호출한 스레드에서 실행돼요. 호출 1건당 1회만 전달돼요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 17 | k_EStoveCommonResultCode_NotInitialized | 결제 기능이 초기화되지 않았어요. | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 관리되지 않는 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 관리되는 예외가 발생했어요(로그인 토큰 등 내부 엔티티 누락 포함). | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
네트워크/서버 응답 오류는 하위 HTTP 계층에서 전달돼요.
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
params | 호출자 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)params) 필수. 호출이 반환된 뒤 해제해요. |
콜백의 callbackResult | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
콜백의 list(및 그 안의 각 IStoveProduct) | SDK | 해제 금지. 콜백이 끝나면 무효처리되며, 필요한 값은 콜백 안에서 복사해 두어야 해요. |
Example
void __cdecl OnFetchProductsFinished(const IStoveCallbackResult* callbackResult, const IStoveProductList* list)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
uint32_t count = Stove_IStoveProductList_GetCount(list);
for (uint32_t i = 0; i < count; ++i)
{
const IStoveProduct* product = Stove_IStoveProductList_GetAt(list, i);
int64_t productId = Stove_IStoveProduct_GetProductId(product);
const wchar_t* productName = Stove_IStoveProduct_GetProductName(product);
}
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
// 호출
IStoveFetchProductsParam* params = (IStoveFetchProductsParam*)Stove_CreateParam(k_EStoveIAPTypeKind_FetchProductsParam);
Stove_IStoveFetchProductsParam_SetCategoryId(params, L"");
Stove_IStoveFetchProductsParam_SetPageIndex(params, 1);
Stove_IStoveFetchProductsParam_SetPageSize(params, 20);
Stove_FetchProducts(params, OnFetchProductsFinished, nullptr);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)params);
Notes
- 이 호출은 상품 목록 조회의 확장 동작(구 인터페이스의
Ex변형에 해당)을 수행해요. - 이 함수는 비동기 함수이며 결과는
onFinished콜백으로만 전달돼요. params는Stove_CreateParam(k_EStoveIAPTypeKind_FetchProductsParam)으로 생성해요.- 조회된 상품의
ProductId는 Stove_StartPurchase 호출 시 주문 항목의 상품 식별자로 사용해요.
See Also
Stove_FetchShopCategories
종류 함수 · 모듈 IAP · 버전 3.5.0
Description
상점에 등록된 카테고리 목록을 조회해요. 조회된 카테고리 목록은 onFinished 콜백으로 IStoveShopCategoryList 형태로 전달돼요.
Stove_FetchProducts 호출 시 카테고리 ID로 상품을 필터링할 수 있으므로, 상점 화면을 구성할 때는 이 함수로 먼저 카테고리 목록을 받아온 뒤 각 카테고리에 속한 상품을 조회하는 순서로 사용해요.
Declaration
void Stove_FetchShopCategories(const IStoveTypeBase* param, OnFetchShopCategoriesCallback onFinished, void* userData);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IStoveTypeBase* | N | 예약된 매개변수예요. 현재 사용되지 않으므로 항상 nullptr을 전달해요. |
onFinished | OnFetchShopCategoriesCallback | Y | 카테고리 목록을 받을 콜백이에요. |
userData | void* | N | 콜백에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnFetchShopCategoriesCallback)(const IStoveCallbackResult* callbackResult, const IStoveShopCategoryList* list);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
list | const IStoveShopCategoryList* | 조회된 카테고리 목록이에요. Stove_IStoveShopCategoryList_GetCount() / Stove_IStoveShopCategoryList_GetAt()으로 순회해요. |
콜백은 Stove_RunCallback()을 호출한 스레드에서 실행돼요. 호출 1건당 1회만 전달돼요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 17 | k_EStoveCommonResultCode_NotInitialized | 결제 기능이 초기화되지 않았어요. | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 관리되지 않는 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 관리되는 예외가 발생했어요(로그인 토큰 등 내부 엔티티 누락 포함). | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
네트워크/서버 응답 오류는 하위 HTTP 계층에서 전달돼요.
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | 현재 사용되지 않는 예약 매개변수이므로 해제할 대상이 없어요. |
콜백의 callbackResult | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
콜백의 list(및 그 안의 각 IStoveShopCategory) | SDK | 해제 금지. 콜백이 끝나면 무효처리되며, 필요한 값은 콜백 안에서 복사해 두어야 해요. |
Example
void __cdecl OnFetchShopCategoriesFinished(const IStoveCallbackResult* callbackResult, const IStoveShopCategoryList* list)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
uint32_t count = Stove_IStoveShopCategoryList_GetCount(list);
for (uint32_t i = 0; i < count; ++i)
{
const IStoveShopCategory* category = Stove_IStoveShopCategoryList_GetAt(list, i);
const wchar_t* categoryId = Stove_IStoveShopCategory_GetCategoryId(category);
const wchar_t* categoryName = Stove_IStoveShopCategory_GetCategoryName(category);
}
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
// 호출
Stove_FetchShopCategories(nullptr, OnFetchShopCategoriesFinished, nullptr);
Notes
- 이 함수는 비동기 함수이며 결과는
onFinished콜백으로만 전달돼요. param은 현재 사용되지 않는 예약 매개변수이므로 항상nullptr을 전달해요.- 조회된 카테고리의
CategoryId는 Stove_FetchProducts 호출 시 카테고리 필터로 사용할 수 있어요.
See Also
Stove_FetchTermsAgreement
종류 함수 · 모듈 IAP · 버전 3.5.0
Description
사용자가 현재 약관에 동의했는지 조회해요. 이미 동의한 경우 onFinished로 전달되는 결과의 IsAgreed()가 true이며 Url은 빈 문자열이에요. 동의하지 않은 경우 param의 Operation(EStoveTermsOperation) 값에 따라 동작이 달라져요.
Default:onFinished로 전달되는Url을 이용해 호출자가 직접 약관 페이지를 열어야 해요.WithWebView: SDK가 Stove Webview로 약관 페이지를 직접 표시해요.
웹뷰가 아예 생성되지 않고 호출이 종료되는 모든 실패(미초기화, 예외 등)에서
onDestroy가PopupNotCreated(33)로 1회 함께 호출돼요. 자세한 내용은 오류코드와 콜백 항목을 참고하세요.
Declaration
void Stove_FetchTermsAgreement(const IStoveFetchTermsAgreementParam* param,
OnFetchTermsAgreementCallback onFinished, OnIAPPopupDestroyCallback onDestroy,
void* userData1, void* userData2);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IStoveFetchTermsAgreementParam* | Y | 약관 조회 동작과 웹뷰 배치 파라미터예요. |
onFinished | OnFetchTermsAgreementCallback | Y | 동의 여부와 약관 URL을 받을 콜백이에요. |
onDestroy | OnIAPPopupDestroyCallback | N | SDK가 만든 팝업이 모두 닫혔을 때 호출되는 콜백이에요. |
userData1 | void* | N | onFinished에 그대로 전달되는 사용자 데이터예요. |
userData2 | void* | N | onDestroy에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnFetchTermsAgreementCallback)(const IStoveCallbackResult* callbackResult, const IStoveTermsAgreementOutcome* outcome);
typedef void(__cdecl* OnIAPPopupDestroyCallback)(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
outcome | const IStoveTermsAgreementOutcome* | 동의 여부와 약관 URL이에요. Stove_IStoveTermsAgreementOutcome_IsAgreed() / Stove_IStoveTermsAgreementOutcome_GetUrl()로 조회해요. |
reserved | const IStoveTypeBase* | 예약된 매개변수예요. 현재 항상 nullptr이에요. |
두 콜백 모두 Stove_RunCallback()을 호출한 스레드에서 실행돼요.
onFinished는 호출 1건당 1회만 전달돼요.onDestroy는 이 호출로 생성된 팝업이 모두 닫힌 뒤 1회 전달돼요(Operation == WithWebView인 경우 해당). 팝업이 아예 생성되지 않고 호출이 종료된 경우에도 결과 코드PopupNotCreated(33)로 1회 호출돼요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공(이미 동의한 경우도 포함) | x | |
| 17 | k_EStoveCommonResultCode_NotInitialized | 결제 기능이 초기화되지 않았어요. | x | |
| 60 | k_EStoveCommonResultCode_ViewUiNotInitialized | Operation이 Default가 아니어서 약관 페이지를 웹뷰로 열어야 하는데, 웹뷰/팝업 UI 서브시스템이 초기화되지 않았어요. | x | |
| 65 | k_EStoveCommonResultCode_WebviewCloseAllFail | 약관 웹뷰를 열기 전, 기존에 열려 있던 IAP 웹뷰를 모두 닫는 데 실패했어요. | x | |
| 62 | k_EStoveCommonResultCode_WebviewCreateFail | 약관 웹뷰 생성 자체가 실패했어요. | x | |
| 64 | k_EStoveCommonResultCode_WebviewCreateCookieFail | 언어(로케일) 쿠키 설정에 실패했어요. | O | 구매를 위해서는 약관 동의가 필요합니다. 현재 약관 동의 화면을 불러오지 못했습니다. 다시 시도해 주세요. [확인] |
| 63 | k_EStoveCommonResultCode_WebviewLoadUrlFail | 약관 웹뷰에서 약관 페이지 URL 로드에 실패했어요. | x | |
| 66 | k_EStoveCommonResultCode_WebviewCloseFail | 웹뷰가 정상적으로 닫히는 과정에서 내부 닫기 처리가 실패했어요. onFinished가 아니라 onDestroy에 실려요. | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 관리되지 않는 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 관리되는 예외가 발생했어요(로그인 토큰 등 내부 엔티티 누락 포함). | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 33 | k_EStoveCommonResultCode_PopupNotCreated | 팝업이 생성되지 않고 호출이 종료되었어요. onDestroy에만 전달돼요. | x |
네트워크/서버 응답 오류(약관 동의 조회 및 미동의 시 SSO 키 조회 실패 포함)는 하위 HTTP 계층에서 전달돼요.
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param) 필수. 호출이 반환된 뒤 해제해요. |
콜백의 callbackResult | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
콜백의 outcome | SDK | 해제 금지. 콜백이 끝나면 무효처리되며, 필요한 값(예: Url)은 콜백 안에서 복사해 두어야 해요. |
Example
void __cdecl OnFetchTermsAgreementFinished(const IStoveCallbackResult* callbackResult, const IStoveTermsAgreementOutcome* outcome)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
if (!Stove_IStoveTermsAgreementOutcome_IsAgreed(outcome))
{
const wchar_t* url = Stove_IStoveTermsAgreementOutcome_GetUrl(outcome);
// url 로 약관 페이지를 열어 주세요.
}
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
void __cdecl OnFetchTermsAgreementPopupDestroyed(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved)
{
// 약관 페이지 팝업이 모두 닫혔을 때 로직을 구현해 주세요.
}
// 호출
IStoveFetchTermsAgreementParam* param = (IStoveFetchTermsAgreementParam*)Stove_CreateParam(k_EStoveIAPTypeKind_FetchTermsAgreementParam);
Stove_IStoveFetchTermsAgreementParam_SetOperation(param, k_EStoveTermsOperation_Default);
Stove_FetchTermsAgreement(param, OnFetchTermsAgreementFinished, OnFetchTermsAgreementPopupDestroyed, nullptr, nullptr);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param);
Notes
- 이 함수는 비동기 함수이며 결과는
onFinished콜백으로만 전달돼요. Operation == WithWebView를 사용하면 호출자가 약관 페이지의 UI를 직접 구현할 필요가 없어요.WebView*필드(웹뷰 위치·크기, IStoveWebViewLayoutParam 상속 멤버)는Operation != Default일 때만 적용돼요.
See Also
Stove_GetAccessToken
종류 함수 · 모듈 Base · 버전 3.5.0
Description
현재 유효한 AccessToken을 조회해요. SDK가 내부적으로 토큰을 자동 갱신하여 항상 유효한 토큰을 제공해요.
Declaration
IStoveResult* Stove_GetAccessToken(wchar_t* outAccessToken, uint32_t length);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
outAccessToken | wchar_t* | Y | AccessToken 문자열을 받을 버퍼예요. |
length | uint32_t | Y | outAccessToken 버퍼의 길이예요. |
Returns
| Type | Description |
|---|---|
IStoveResult* | 호출 결과예요. Stove_IStoveResult_GetResultCode()가 0이면 성공이에요. |
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | outAccessToken이 nullptr이거나 length가 0이거나, 버퍼가 작아 값이 잘렸어요. | x | |
| 16 | k_EStoveCommonResultCode_BaseNotInitialized | 초기화되지 않은 상태에서 호출했어요. | x | |
| 19 | k_EStoveCommonResultCode_InvalidAccessToken | AccessToken이 유효하지 않아요. | O | 로그인 세션이 만료되었습니다. 게임 종료 후 다시 실행해 주세요. [확인] |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 알 수 없는 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
아래 코드를 받으면 반드시 게임을 종료해야 해요. 정상 진행이 불가능한 상태예요.
19k_EStoveCommonResultCode_InvalidAccessToken— 로그인 세션이 만료되어 재실행이 필요해요
전체 목록: EStoveCommonResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
outAccessToken | 호출자 | 호출자가 할당한 버퍼예요. Destroy 대상이 아니에요 |
반환된 IStoveResult* | 호출자 | Stove_IStoveTypeBase_Destroy() 필수 |
Example
wchar_t accessToken[1024] = { 0 };
IStoveResult* result = Stove_GetAccessToken(accessToken, 1024);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요. accessToken을 사용합니다.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
Notes
- SDK가 내부적으로 토큰을 자동 갱신하므로, 이 함수는 항상 유효한 토큰을 반환해요.
- 조회한 토큰을 게임에서 따로 보관해 두고 다시 쓰지 마세요. SDK 가 토큰을 주기적으로 갱신하므로 보관해 둔 값은 만료될 수 있어요. 토큰이 필요할 때마다 이 함수를 호출해 그때의 유효한 값을 받아 쓰세요.
- 토큰이 갱신되는 시점에 별도로 알림을 받으려면 Stove_AccessTokenRenewed를 사용해요.
See Also
Stove_GetGds
종류 함수 · 모듈 Base · 버전 3.5.0
Description
로그인한 사용자의 GDS(국가 · 시간대) 정보를 조회해요.
Declaration
IStoveResult* Stove_GetGds(IStoveGds** outGds);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
outGds | IStoveGds** | Y | GDS 정보 포인터를 받을 변수예요. 사용 후 Destroy()를 호출해야 해요. |
Returns
| Type | Description |
|---|---|
IStoveResult* | 호출 결과예요. Stove_IStoveResult_GetResultCode()가 0이면 성공이에요. |
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | outGds가 nullptr이에요. | x | |
| 16 | k_EStoveCommonResultCode_BaseNotInitialized | 초기화되지 않은 상태에서 호출했어요. | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 알 수 없는 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
전체 목록: EStoveCommonResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
*outGds | SDK가 생성, 소유권은 호출자로 이전 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)gds) 필수 |
반환된 IStoveResult* | 호출자 | Stove_IStoveTypeBase_Destroy() 필수 |
Example
IStoveGds* gds = nullptr;
IStoveResult* result = Stove_GetGds(&gds);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
const wchar_t* nation = Stove_IStoveGds_GetNation(gds);
const wchar_t* timezone = Stove_IStoveGds_GetTimezone(gds);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)gds);
}
else
{
// 실패 시 로직을 구현해 주세요.
}
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
Notes
- 국가 코드를 IP로 판별하지 못해 기본 국가 코드를 사용한 경우
Stove_IStoveGds_IsDefault()가true를 반환해요.
See Also
Stove_GetSignin
종류 함수 · 모듈 Base · 버전 3.5.0
Description
로그인한 사용자의 가입(Signin) 정보를 조회해요.
Declaration
IStoveResult* Stove_GetSignin(IStoveSignin** outSignin);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
outSignin | IStoveSignin** | Y | 가입 정보 포인터를 받을 변수예요. 사용 후 Destroy()를 호출해야 해요. |
Returns
| Type | Description |
|---|---|
IStoveResult* | 호출 결과예요. Stove_IStoveResult_GetResultCode()가 0이면 성공이에요. |
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | outSignin이 nullptr이에요. | x | |
| 16 | k_EStoveCommonResultCode_BaseNotInitialized | 초기화되지 않은 상태에서 호출했어요. | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 알 수 없는 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
전체 목록: EStoveCommonResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
*outSignin | SDK가 생성, 소유권은 호출자로 이전 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)signin) 필수 |
반환된 IStoveResult* | 호출자 | Stove_IStoveTypeBase_Destroy() 필수 |
Example
IStoveSignin* signin = nullptr;
IStoveResult* result = Stove_GetSignin(&signin);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
bool personVerified = Stove_IStoveSignin_IsPersonVerified(signin);
const wchar_t* providerCode = Stove_IStoveSignin_GetProviderCode(signin);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)signin);
}
else
{
// 실패 시 로직을 구현해 주세요.
}
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
Notes
- 계정 유형(
Stove_IStoveSignin_GetAccountType())은 숫자 코드로 제공돼요. 예: 2=Facebook, 3=Twitter, 6=Naver, 9=Google+, 11=스토브 PC 가입, 12=Apple, 13=LINE, 14=LINE Games, 15=Steam, 16=VTCO 등. 다만 공개된 규격이 값-의미 대응표를 고정해 명시하지 않으므로, IDP 종류(예: STEAM과 STEAM_SHADOW 구분)를 식별할 때는Stove_IStoveSignin_GetProviderCode()를 사용해요.
See Also
Stove_GetUser
종류 함수 · 모듈 Base · 버전 3.5.0
Description
로그인한 사용자 정보를 조회해요.
Declaration
IStoveResult* Stove_GetUser(IStoveUser** outUser);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
outUser | IStoveUser** | Y | 사용자 정보 포인터를 받을 변수예요. 사용 후 Destroy()를 호출해야 해요. |
Returns
| Type | Description |
|---|---|
IStoveResult* | 호출 결과예요. Stove_IStoveResult_GetResultCode()가 0이면 성공이에요. |
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | outUser가 nullptr이에요. | x | |
| 16 | k_EStoveCommonResultCode_BaseNotInitialized | 초기화되지 않은 상태에서 호출했어요. | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 알 수 없는 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
전체 목록: EStoveCommonResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
*outUser | SDK가 생성, 소유권은 호출자로 이전 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)user) 필수 |
반환된 IStoveResult* | 호출자 | Stove_IStoveTypeBase_Destroy() 필수 |
Example
IStoveUser* user = nullptr;
IStoveResult* result = Stove_GetUser(&user);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
const wchar_t* nickName = Stove_IStoveUser_GetNickName(user);
uint64_t userId = Stove_IStoveUser_GetUserId(user);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)user);
}
else
{
// 실패 시 로직을 구현해 주세요.
}
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
Notes
- 로그인한 사용자의 국가 · 지역 정보는 Stove_GetGds, 가입 정보는 Stove_GetSignin으로 별도 조회해요.
See Also
Stove_GetVersion
종류 함수 · 모듈 Base · 버전 3.5.0
Description
SDK 버전 정보를 조회하는 동기 함수예요.
Declaration
IStoveResult* Stove_GetVersion(wchar_t* outVersion, uint32_t length);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
outVersion | wchar_t* | Y | 버전 문자열을 받을 버퍼예요. 호출자가 미리 할당해요. |
length | uint32_t | Y | outVersion 버퍼의 길이(문자 수)예요. |
Returns
| Type | Description |
|---|---|
IStoveResult* | 호출 결과예요. Stove_IStoveResult_IsSuccessful(result)이면 성공이에요. |
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | outVersion이 nullptr이거나 length가 0, 또는 버퍼가 작아 버전 문자열이 잘림(STRUNCATE) | x | |
| 251 | k_EStoveCommonResultCode_PcsdkDllNotFound | 실행 파일 경로에서 DLL 경로를 찾지 못함 | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 알 수 없는 예외가 발생함 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 내부 예외가 발생함 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
outVersion | 호출자 | 호출자가 할당한 버퍼예요. Destroy 대상이 아니에요. |
반환된 IStoveResult* | 호출자 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result) 필수 |
Example
wchar_t version[64] = { 0 };
IStoveResult* result = Stove_GetVersion(version, 64);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요. version에 버전 문자열이 담겨 있습니다.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
Notes
- 이 함수는 동기 함수이며 콜백을 받지 않아요.
Stove_Initialize
종류 함수 · 모듈 Base · 버전 3.5.0
Description
SDK를 초기화해요. 단일바이너리(BaseSDK Consolidation) 통합 이후에는 이 함수가 View 모듈과 IAP 모듈의 초기화도 함께 처리해요.
SDK는 Stove_RestartAppIfNecessary()가 캐시해 둔 환경(Environment) · 게임 ID · 앱 키 값을 재사용해요. 여기에 더해 initParam에 메인 윈도우 핸들(SetMainWndHandle)이 설정되어 있으면 View 모듈이 초기화되고, 상점 키(SetShopKey)까지 설정되어 있으면 IAP 모듈도 함께 초기화돼요. initParam을 nullptr로 전달하면 SDK만 초기화해요.
실패 시 SDK가 일부만 초기화된 상태로 남을 수 있어요(예: SDK와 View는 초기화되었지만 IAP는 실패). 이런 경우
Stove_Uninitialize()를 호출한 뒤 깨끗한 상태에서Stove_Initialize()를 다시 시도해야 해요.Uninitialize없이 다시 호출하면ALREADY_INITIALIZED가 반환되고 실패했던 모듈의 초기화는 재시도되지 않아요.
Declaration
IStoveResult* Stove_Initialize(const IStoveInitializeParam* initParam);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
initParam | IStoveInitializeParam* | N | 초기화 정보예요. nullptr을 전달하면 SDK만 초기화해요. |
Returns
| Type | Description |
|---|---|
IStoveResult* | 호출 결과예요. Stove_IStoveResult_GetResultCode()가 0이면 성공이에요. Stove_IStoveResult_GetMethodCode()로 어느 모듈에서 실패했는지 유추할 수 있어요. |
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | 환경(environment) · 게임 ID · 앱 키 중 하나라도 비어 있어요(Stove_RestartAppIfNecessary() 호출 시 전달한 값을 확인해요). | x | |
| 18 | k_EStoveCommonResultCode_AlreadyInitialized | 이미 초기화되어 있어요. | x | |
| 304 | k_EStoveResultCode_NeedStoveLauncher | Stove_RestartAppIfNecessary()를 먼저 호출해 런처 연결을 완료해야 해요. | O | 게임이 스토브 PC 클라이언트를 통해 실행되지 않아 종료됩니다.클라이언트에서 다시 게임을 실행해주세요.클라이언트 미설치 시 스토브 홈페이지에서 설치해주세요.[확인] |
| 251 | k_EStoveCommonResultCode_PcsdkDllNotFound | 내부 버전 조회(GetVersion) 실패 결과가 그대로 전달되었어요. | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 알 수 없는 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 예외가 발생했어요(필수 정보 파싱 실패 등 하위 계층 오류 포함). | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
아래 코드를 받으면 반드시 게임을 종료해야 해요. 정상 진행이 불가능한 상태예요.
304k_EStoveResultCode_NeedStoveLauncher— 스토브 PC 클라이언트를 통해 실행되지 않아 재실행이 필요해요
하위 계층(토큰 처리 로직)에서 k_EStoveCommonResultCode_Fail(1) 또는 k_EStoveResultCode_NotFoundRequiredInformation(302)이 전달될 수 있어요.
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
initParam | 호출자 | 전달했다면 Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)initParam) 필수 |
반환된 IStoveResult* | 호출자 | Stove_IStoveTypeBase_Destroy() 필수 |
Example
IStoveInitializeParam* initParam = (IStoveInitializeParam*)Stove_CreateParam(k_EStoveBaseTypeKind_InitializeParam);
Stove_IStoveInitializeParam_SetMainWndHandle(initParam, hWnd);
Stove_IStoveInitializeParam_SetShopKey(initParam, L"YOUR_SHOP_KEY");
IStoveResult* result = Stove_Initialize(initParam);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
// Stove_IStoveResult_GetMethodCode() / Stove_IStoveResult_GetResultCode()로 어느 모듈에서 실패했는지 확인합니다.
}
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)initParam);
Notes
initParam에 메인 윈도우 핸들을 설정하면 View 모듈이 함께 초기화되고, 상점 키까지 설정하면 IAP 모듈도 함께 초기화돼요.- 실패 후 재시도할 때는 반드시
Stove_Uninitialize()를 먼저 호출해야 해요. Stove_RestartAppIfNecessary()를 먼저 호출해 두면 그때 캐시된 환경 · 게임 ID · 앱 키 값을 재사용해요.
See Also
Stove_ManualPopup
종류 함수 · 모듈 View · 버전 3.5.0
Description
이 함수는 param 의 리소스 키(IStoveManualPopupParam::GetResourceKey())로 지정한 팝업 콘텐츠를 웹뷰로 표시해요. 오토/뉴스/쿠폰 팝업처럼 서버가 자동으로 내려주는 팝업이 아니라, 게임에서 표시 시점과 콘텐츠를 직접 지정하는 팝업이에요.
SDK 초기화(Stove_Initialize()) 이후에 호출해야 해요.
Declaration
void Stove_ManualPopup(const IStoveManualPopupParam* param,
OnViewPopupCallback onFinished, OnViewPopupDestroyCallback onDestroy,
void* userData1, void* userData2);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IStoveManualPopupParam* | Y | 표시할 팝업의 리소스 키(ResourceKey)와 웹뷰 표시 모드예요. |
onFinished | OnViewPopupCallback | Y | 팝업 생성 결과를 전달받을 콜백이에요. |
onDestroy | OnViewPopupDestroyCallback | N | 팝업(웹뷰)이 닫힌 뒤 전달받을 콜백이에요. 생략하면 결과를 받을 수 없어요. |
userData1 | void* | N | onFinished 에 그대로 전달되는 사용자 데이터예요. |
userData2 | void* | N | onDestroy 에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnViewPopupCallback)(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved);
typedef void(__cdecl* OnViewPopupDestroyCallback)(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
reserved | const IStoveTypeBase* | 예약된 인자예요. 현재 구현에서는 항상 nullptr 로 전달돼요. |
두 콜백 모두 Stove_RunCallback() 을 호출한 스레드에서 실행돼요.
onFinished는 팝업 생성 결과에 대해 1회 전달돼요.onDestroy는 웹뷰가 완전히 닫힌 뒤 1회 전달돼요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | param 의 ResourceKey 가 빈 문자열이에요 | x | |
| 17 | k_EStoveCommonResultCode_NotInitialized | SDK 가 초기화되지 않았어요 | x | |
| 60 | k_EStoveCommonResultCode_ViewUiNotInitialized | View UI 서브시스템이 초기화되지 않았어요(방어적 코드 경로로, 정상 흐름에서는 발생하지 않아요) | x | |
| 62 | k_EStoveCommonResultCode_WebviewCreateFail | 웹뷰 생성에 실패했어요(일부만 생성된 경우 포함) | x | |
| 63 | k_EStoveCommonResultCode_WebviewLoadUrlFail | 웹뷰에서 URL 로드에 실패했어요 | x | |
| 65 | k_EStoveCommonResultCode_WebviewCloseAllFail | 팝업 생성 전 기존 웹뷰를 일괄 닫는 데 실패했어요 | x | |
| 66 | k_EStoveCommonResultCode_WebviewCloseFail | onDestroy 시점에 웹뷰가 정상적으로 닫히지 않았어요 | x | |
| 67 | k_EStoveCommonResultCode_NoPopupData | 지정한 리소스 키에 대응하는 팝업 콘텐츠가 없어요 | O | 팝업 설정 정보가 존재하지 않아 표시할 창이 없습니다. [확인] |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 관리되지 않는 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 관리되는 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param) 필수. Stove_ManualPopup() 호출이 끝나면 곧바로 해제할 수 있어요. |
콜백의 callbackResult | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
콜백의 reserved | SDK(항상 nullptr) | 해제 금지. |
Example
void __cdecl OnManualPopupFinished(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
void __cdecl OnManualPopupDestroyed(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
IStoveManualPopupParam* param =
(IStoveManualPopupParam*)Stove_CreateParam(k_EStoveViewTypeKind_ManualPopupParam);
Stove_IStoveManualPopupParam_SetResourceKey(param, L"EVENT_BANNER_01");
Stove_IStoveManualPopupParam_SetWebViewMode(param, k_EStoveWebViewMode_Internal);
Stove_ManualPopup(param, OnManualPopupFinished, OnManualPopupDestroyed, nullptr, nullptr);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param);
// 게임 루프 안에서 반복 호출해야 콜백이 실행됩니다.
while (isGameRunning)
{
Stove_RunCallback();
}
Notes
- 이 함수는 비동기 함수이며, 두 콜백은
Stove_RunCallback()을 호출하는 스레드에서 실행돼요. - 웹뷰가 아예 만들어지지 못하고 호출이 조기 종료되는 경우(예: 미초기화,
ResourceKey빈 문자열), 실패 사유는onFinished로만 전달돼요. 이 경우onDestroy는 호출되지 않으므로,onDestroy가 오지 않았다고 해서 웹뷰가 아직 열려 있다고 판단해서는 안 돼요. - Stove_AutoPopup/Stove_NewsPopup/Stove_CouponPopup 과 달리 표시할 콘텐츠를 서버가 자동으로 정하지 않고, 호출자가
ResourceKey로 직접 지정해요. - 특정 팝업을 일정 기간 다시 표시하지 않게 하려면 Stove_SetPopupDisallowed 를 사용해요.
See Also
Stove_NewsPopup
종류 함수 · 모듈 View · 버전 3.5.0
Description
이 함수는 서버에서 내려주는 뉴스(공지) 팝업 목록을 조회하여 웹뷰로 표시해요.
SDK 초기화(Stove_Initialize()) 이후에 호출해야 해요.
Declaration
void Stove_NewsPopup(const IStovePopupParam* param,
OnViewPopupCallback onFinished, OnViewPopupDestroyCallback onDestroy,
void* userData1, void* userData2);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IStovePopupParam* | Y | 뉴스 팝업 표시에 사용할 파라미터예요(웹뷰 표시 모드). |
onFinished | OnViewPopupCallback | Y | 팝업 생성 결과를 전달받을 콜백이에요. |
onDestroy | OnViewPopupDestroyCallback | N | 팝업(웹뷰)이 닫힌 뒤 전달받을 콜백이에요. 생략하면 결과를 받을 수 없어요. |
userData1 | void* | N | onFinished 에 그대로 전달되는 사용자 데이터예요. |
userData2 | void* | N | onDestroy 에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnViewPopupCallback)(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved);
typedef void(__cdecl* OnViewPopupDestroyCallback)(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
reserved | const IStoveTypeBase* | 예약된 인자예요. 현재 구현에서는 항상 nullptr 로 전달돼요. |
두 콜백 모두 Stove_RunCallback() 을 호출한 스레드에서 실행돼요.
onFinished는 팝업 생성 결과에 대해 1회 전달돼요.onDestroy는 웹뷰가 완전히 닫힌 뒤 1회 전달돼요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 17 | k_EStoveCommonResultCode_NotInitialized | SDK 가 초기화되지 않았어요 | x | |
| 60 | k_EStoveCommonResultCode_ViewUiNotInitialized | View UI 서브시스템이 초기화되지 않았어요(방어적 코드 경로로, 정상 흐름에서는 발생하지 않아요) | x | |
| 62 | k_EStoveCommonResultCode_WebviewCreateFail | 웹뷰 생성에 실패했어요(팝업이 여러 개일 때 일부만 생성 실패한 경우 포함) | x | |
| 63 | k_EStoveCommonResultCode_WebviewLoadUrlFail | 웹뷰에서 URL 로드에 실패했어요 | x | |
| 65 | k_EStoveCommonResultCode_WebviewCloseAllFail | 팝업 생성 전 기존 웹뷰를 일괄 닫는 데 실패했어요 | x | |
| 66 | k_EStoveCommonResultCode_WebviewCloseFail | onDestroy 시점에 웹뷰가 정상적으로 닫히지 않았어요 | x | |
| 67 | k_EStoveCommonResultCode_NoPopupData | 표시할 뉴스 팝업 데이터가 없어요 | O | 팝업 설정 정보가 존재하지 않아 표시할 창이 없습니다. [확인] |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 관리되지 않는 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 관리되는 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param) 필수. Stove_NewsPopup() 호출이 끝나면 곧바로 해제할 수 있어요. |
콜백의 callbackResult | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
콜백의 reserved | SDK(항상 nullptr) | 해제 금지. |
Example
void __cdecl OnNewsPopupFinished(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
void __cdecl OnNewsPopupDestroyed(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
IStovePopupParam* param =
(IStovePopupParam*)Stove_CreateParam(k_EStoveViewTypeKind_PopupParam);
Stove_IStovePopupParam_SetWebViewMode(param, k_EStoveWebViewMode_Internal);
Stove_NewsPopup(param, OnNewsPopupFinished, OnNewsPopupDestroyed, nullptr, nullptr);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param);
// 게임 루프 안에서 반복 호출해야 콜백이 실행됩니다.
while (isGameRunning)
{
Stove_RunCallback();
}
Notes
- 이 함수는 비동기 함수이며, 두 콜백은
Stove_RunCallback()을 호출하는 스레드에서 실행돼요. - 웹뷰가 아예 만들어지지 못하고 호출이 조기 종료되는 경우(예: 미초기화), 실패 사유는
onFinished로만 전달돼요. 이 경우onDestroy는 호출되지 않으므로,onDestroy가 오지 않았다고 해서 웹뷰가 아직 열려 있다고 판단해서는 안 돼요. - Stove_AutoPopup, Stove_CouponPopup 과 파라미터 타입(IStovePopupParam)을 공유하며, 서버가 내려주는 팝업 종류만 달라요.
- 특정 팝업을 일정 기간 다시 표시하지 않게 하려면 Stove_SetPopupDisallowed 를 사용해요.
See Also
Stove_OpenExternalUrl
종류 함수 · 모듈 Base · 버전 3.5.0
Description
외부 브라우저로 URL을 열어요. Onstove 관련 도메인(예: *.onstove.com)을 열 때는 SSO 처리를 함께 수행해요.
Declaration
void Stove_OpenExternalUrl(const wchar_t* url, OnOpenExternalUrlCallback onFinished, void* userData);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
url | const wchar_t* | Y | 열고자 하는 URL이에요. |
onFinished | OnOpenExternalUrlCallback | Y | 결과를 받을 콜백이에요. |
userData | void* | N | 콜백에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnOpenExternalUrlCallback)(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
reserved | const IStoveTypeBase* | 향후 확장을 위해 인자 개수를 미리 맞춰 둔 예약 필드예요. 현재 SDK에서는 항상 nullptr이에요. |
콜백은 Stove_RunCallback()(또는 Stove_RunCallbackWithTimeout())을 호출한 스레드에서 실행돼요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공(브라우저에서 URL 열기 성공) | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | onFinished가 nullptr | x | |
| 16 | k_EStoveCommonResultCode_BaseNotInitialized | SDK가 초기화되지 않음 | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 브라우저 실행에 실패했거나, 실행 중 알 수 없는 예외가 발생함 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 내부 예외가 발생함 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
Onstove 관련 도메인을 열 때 내부적으로 조회하는 SSO 키(simKey) 조회가 실패하면, 그 결과 코드가 하위 계층에서 그대로 전달돼요.
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
url | 호출자 | 문자열 인자예요. Destroy 대상이 아니에요. |
콜백의 callbackResult, reserved | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
Example
void OnOpenExternalUrl(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Stove_OpenExternalUrl(L"https://www.onstove.com", OnOpenExternalUrl, nullptr);
// 게임 루프에서 주기적으로 호출해야 콜백이 전달됩니다.
Stove_RunCallback();
Notes
- Onstove 관련 도메인(
*.onstove.com등)을 열 때는 SSO 처리가 함께 수행돼요. - 콜백의
reserved인자는 현재 항상 nullptr이에요.if (reserved)로 향후 확장 여부를 확인할 수 있어요.
Stove_OverImmersionNotification
종류 함수 · 모듈 Base · 버전 3.5.0
Description
한국 과몰입 방지 규제 대상 사용자에게 매시간 알림을 콜백으로 전달해요. 한국 전용 API예요.
이 콜백은 1회성이 아니라 대상 사용자에게 매시간 반복해서 전달돼요.
Declaration
void Stove_OverImmersionNotification(const IStoveTypeBase* param, OnOverImmersionNotificationCallback onFinished, void* userData);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IStoveTypeBase* | N | 예약된 인자로, 전용 TypeKind는 정의되어 있지 않아요. |
onFinished | OnOverImmersionNotificationCallback | Y | 결과를 받을 콜백이에요. |
userData | void* | N | 콜백에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnOverImmersionNotificationCallback)(const IStoveCallbackResult* callbackResult, const IStoveOverImmersionInfo* overImmersion);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
overImmersion | const IStoveOverImmersionInfo* | 과몰입 방지 알림 정보예요. 경고 메시지(GetMsg()), 누적 게임 시간(GetElapsedHours(), 시간 단위), 메시지 노출 시간(GetExposureTime(), 초 단위)을 제공해요. |
콜백은 Stove_RunCallback()(또는 Stove_RunCallbackWithTimeout())을 호출한 스레드에서 실행돼요. 대상 사용자에게 매시간 반복해서 전달돼요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | onFinished가 nullptr | x | |
| 16 | k_EStoveCommonResultCode_BaseNotInitialized | SDK가 초기화되지 않음 | x | |
| 31 | k_EStoveCommonResultCode_NotSupportedCountry | 로그인 계정의 GDS 국가 코드가 한국(kr)이 아님 | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 알 수 없는 예외가 발생함 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 내부 예외가 발생함 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | 전달했다면 Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param) 필수 |
콜백의 callbackResult, overImmersion | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
Example
void OnOverImmersionNotification(const IStoveCallbackResult* callbackResult, const IStoveOverImmersionInfo* overImmersion)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
const wchar_t* msg = Stove_IStoveOverImmersionInfo_GetMsg(overImmersion);
int32_t exposureTime = Stove_IStoveOverImmersionInfo_GetExposureTime(overImmersion);
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Stove_OverImmersionNotification(nullptr, OnOverImmersionNotification, nullptr);
// 게임 루프에서 주기적으로 호출해야 콜백이 전달됩니다.
Stove_RunCallback();
Notes
- 한국 전용 API예요.
- 대상 사용자에게 매시간 반복해서 전달되는 콜백이에요. 1회성 콜백이 아니에요.
See Also
Stove_PCBangCheckStatus
종류 함수 · 모듈 PCBang · 버전 3.5.0
Description
이 함수는 현재 PC방 상황과 사용자가 이용 가능한 상품(entitlement) 정보를 조회해요. 결과는 콜백에 IStovePCBangStatus 로 전달돼요.
PC방 로그인 여부와 무관하게, 현재 시점의 PC방 상태를 온디맨드로 조회할 때 호출해요.
이 함수는 옛 이름
CheckUserStatus에서CheckStatus로 개명되었어요. 기존 연동을 옮기는 경우 함수 이름과 메서드 코드 이름이 모두 바뀐 점을 확인하세요.
Declaration
void Stove_PCBangCheckStatus(const IStoveTypeBase* param, OnPCBangCheckStatusCallback onFinished, void* userData);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IStoveTypeBase* | N | 예약된 파라미터예요. 현재 구현은 이 값을 사용하지 않으므로((void)param 처리) nullptr 을 전달해요. |
onFinished | OnPCBangCheckStatusCallback | Y | 조회 결과를 전달받을 콜백이에요. |
userData | void* | N | 콜백에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnPCBangCheckStatusCallback)(const IStoveCallbackResult* callbackResult, const IStovePCBangStatus* status);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
status | const IStovePCBangStatus* | 현재 PC방 상황과 상품 코드 정보예요. |
콜백은 Stove_RunCallback() 을 호출한 스레드에서 실행되며, 조회 결과에 대해 1회만 호출돼요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | onFinished 가 nullptr 이에요 | x | |
| 17 | k_EStoveCommonResultCode_NotInitialized | SDK 가 초기화되지 않았어요 | x | |
| 22 | k_EStoveCommonResultCode_HttpError | 상태 조회 요청의 HTTP 상태 코드가 200 이 아니에요 | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
| 23 | k_EStoveCommonResultCode_ResponseError | 응답에 code/message 필드가 없거나 서버가 비즈니스 오류를 반환했어요(최상위 JSON 파싱 실패도 이 코드로 처리돼요) | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
| 25 | k_EStoveCommonResultCode_ResponseValueIsNull | 응답의 value 가 JSON null 이에요 | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
| 249 | k_EStoveCommonResultCode_NetworkTransportError | 네트워크 전송 계층 예외가 발생했어요 | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 알 수 없는 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 처리된 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
로그인과 달리 응답 복호화 단계가 없어 k_EStoveCommonResultCode_ResponseInvalidValueFormat(26) 은 발생하지 않아요.
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | 현재 사용하지 않는 예약 파라미터이므로 nullptr 을 전달하며 별도로 해제할 필요가 없어요. |
콜백의 callbackResult, status | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
Example
void __cdecl OnCheckStatus(const IStoveCallbackResult* callbackResult, const IStovePCBangStatus* status)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
int32_t premium = Stove_IStovePCBangStatus_GetPremiumCheck(status);
int32_t psn = Stove_IStovePCBangStatus_GetPsn(status);
int32_t productCode = Stove_IStovePCBangStatus_GetProductCode(status);
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Stove_PCBangCheckStatus(nullptr, OnCheckStatus, nullptr);
// 게임 루프 안에서 반복 호출해야 콜백이 실행됩니다.
while (isGameRunning)
{
Stove_RunCallback();
}
Notes
- 이 함수는 비동기 함수이며, 콜백은
Stove_RunCallback()을 호출하는 스레드에서 1회 실행돼요. - 옛 이름은
CheckUserStatus이에요.Stove_PCBangCheckStatus로 개명되었으며, 이에 대응하는 메서드 코드 이름도k_EStovePCBangMethodCode_CheckStatus로 바뀌었어요. - Stove_PCBangLogin 의 최초 로그인 결과(
IStovePCBangLoginOutcome)와는 별개의 온디맨드 조회 API 예요. PC방 로그인 여부와 무관하게 호출할 수 있어요.
See Also
Stove_PCBangLogin
종류 함수 · 모듈 PCBang · 버전 3.5.0
Description
이 함수는 로그인한 게임 유저를 PC방 서비스에 로그인시켜요. 콜백을 2개 받아요. onUserLogin 은 최초 로그인 결과를 1회만 전달하고, onRefreshBenefit 은 로그인이 성공한 뒤부터 PC방 세션이 유지되는 동안 4분 주기로 갱신된 혜택 정보를 반복 전달해요.
두 콜백은 서로 독립적으로 등록·실행되므로, 최초 로그인 처리와 혜택 갱신 처리를 각각 별도 로직으로 구현해야 해요.
onRefreshBenefit은 1회성이 아니에요. PC방 프리미엄(k_EStovePCBangPremium_Premium) 상태뿐 아니라 무료(k_EStovePCBangPremium_Free) 상태에서도 4분 주기로 계속 반복 호출돼요. Stove_PCBangLogout 을 호출하기 전까지 멈추지 않아요.
Declaration
void Stove_PCBangLogin(const IStoveTypeBase* param,
OnPCBangLoginCallback onUserLogin, OnRefreshPCBangBenefitCallback onRefreshBenefit,
void* userData1, void* userData2);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IStoveTypeBase* | N | 예약된 파라미터예요. 현재 구현은 이 값을 사용하지 않으므로((void)param 처리) nullptr 을 전달해요. |
onUserLogin | OnPCBangLoginCallback | Y | 최초 로그인 결과를 전달받을 콜백이에요. |
onRefreshBenefit | OnRefreshPCBangBenefitCallback | Y | 4분 주기로 갱신되는 혜택 정보를 전달받을 콜백이에요. |
userData1 | void* | N | onUserLogin 에 그대로 전달되는 사용자 데이터예요. |
userData2 | void* | N | onRefreshBenefit 에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnPCBangLoginCallback)(const IStoveCallbackResult* callbackResult, const IStovePCBangLoginOutcome* loginOutcome);
typedef void(__cdecl* OnRefreshPCBangBenefitCallback)(const IStoveCallbackResult* callbackResult, const IStovePCBangBenefitInfo* benefitInfo);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
loginOutcome | const IStovePCBangLoginOutcome* | 최초 로그인 결과예요. onUserLogin 에만 전달돼요. |
benefitInfo | const IStovePCBangBenefitInfo* | 갱신된 혜택 정보예요. onRefreshBenefit 에만 전달돼요. |
두 콜백 모두 Stove_RunCallback() 을 호출한 스레드에서 실행돼요.
onUserLogin은 최초 로그인 결과에 대해 1회만 호출돼요.onRefreshBenefit은 로그인이 성공한 이후 PC방 세션이 유지되는 동안 4분 주기로 반복 호출돼요. 프리미엄·무료 상태 모두에서 계속 호출되며, Stove_PCBangLogout 을 호출해야 중단돼요.
Error Codes
onUserLogin (로그인 완료) 결과 코드
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | onUserLogin 이 nullptr 이에요 | x | |
| 17 | k_EStoveCommonResultCode_NotInitialized | SDK 가 초기화되지 않았어요 | x | |
| 22 | k_EStoveCommonResultCode_HttpError | 로그인 요청의 HTTP 상태 코드가 200 이 아니에요 | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
| 23 | k_EStoveCommonResultCode_ResponseError | 응답에 code/message 필드가 없거나 서버가 비즈니스 오류를 반환했어요 | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
| 25 | k_EStoveCommonResultCode_ResponseValueIsNull | 응답의 value/data 가 JSON null 이에요 | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
| 26 | k_EStoveCommonResultCode_ResponseInvalidValueFormat | 응답 복호화 후 JSON 파싱에 실패했어요 | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
| 249 | k_EStoveCommonResultCode_NetworkTransportError | 네트워크 전송 계층 예외가 발생했어요 | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 알 수 없는 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 처리된 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
onRefreshBenefit (혜택 갱신) 결과 코드
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | onRefreshBenefit 이 nullptr 이에요 | x | |
| 17 | k_EStoveCommonResultCode_NotInitialized | SDK 가 초기화되지 않았어요 | x | |
| 22 | k_EStoveCommonResultCode_HttpError | 혜택 갱신 요청의 HTTP 상태 코드가 200 이 아니에요 | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
| 23 | k_EStoveCommonResultCode_ResponseError | 응답에 code/message 필드가 없거나 서버가 비즈니스 오류를 반환했어요 | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
| 25 | k_EStoveCommonResultCode_ResponseValueIsNull | 응답의 value/data 가 JSON null 이에요 | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
| 26 | k_EStoveCommonResultCode_ResponseInvalidValueFormat | 응답 복호화 후 JSON 파싱에 실패했어요 | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
| 249 | k_EStoveCommonResultCode_NetworkTransportError | 네트워크 전송 계층 예외가 발생했어요 | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 알 수 없는 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 처리된 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
한 번의 혜택 갱신에 실패해도 반복 호출 자체는 멈추지 않고 4분 주기로 계속돼요.
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | 현재 사용하지 않는 예약 파라미터이므로 nullptr 을 전달하며 별도로 해제할 필요가 없어요. |
콜백의 callbackResult | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
콜백의 loginOutcome, benefitInfo | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
Example
void __cdecl OnUserLogin(const IStoveCallbackResult* callbackResult, const IStovePCBangLoginOutcome* loginOutcome)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
int32_t premium = Stove_IStovePCBangLoginOutcome_GetPremiumCheck(loginOutcome);
int32_t psn = Stove_IStovePCBangLoginOutcome_GetPsn(loginOutcome);
int32_t remainTime = Stove_IStovePCBangLoginOutcome_GetRemainTime(loginOutcome);
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
void __cdecl OnRefreshBenefit(const IStoveCallbackResult* callbackResult, const IStovePCBangBenefitInfo* benefitInfo)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// PCBANG_FREE 상태에서도 4분 주기로 계속 호출됩니다.
int32_t premium = Stove_IStovePCBangBenefitInfo_GetPremiumCheck(benefitInfo);
int32_t remainTime = Stove_IStovePCBangBenefitInfo_GetRemainTime(benefitInfo);
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Stove_PCBangLogin(nullptr, OnUserLogin, OnRefreshBenefit, nullptr, nullptr);
// 게임 루프 안에서 반복 호출해야 콜백이 실행됩니다.
while (isGameRunning)
{
Stove_RunCallback();
}
Notes
- 이 함수는 비동기 함수이며, 두 콜백 모두
Stove_RunCallback()을 호출하는 스레드에서 실행돼요. onRefreshBenefit은 PC방 프리미엄(유료) 상태뿐 아니라 무료(PCBANG_FREE) 상태에서도 로그인 성공 후 4분마다 반복 호출돼요. 무료 상태라고 해서 콜백 등록을 건너뛰거나 무시해서는 안 돼요.onRefreshBenefit은onUserLogin과 별개로 관리되는 콜백이므로, 최초 로그인 처리와 혜택 갱신 처리를 하나의 콜백에서 함께 처리하려고 하면 안 돼요.- Stove_PCBangLogout 을 호출해야
onRefreshBenefit의 반복 호출이 중단돼요.
See Also
- Stove_PCBangLogout
- Stove_PCBangCheckStatus
- IStovePCBangLoginOutcome
- IStovePCBangBenefitInfo
- EStovePCBangPremium
- EStovePCBangMethodCode
Stove_PCBangLogout
종류 함수 · 모듈 PCBang · 버전 3.5.0
Description
이 함수는 게임 유저를 PC방 서비스에서 로그아웃시켜요. Stove_PCBangLogin 이 시작한 4분 주기 혜택 갱신 콜백(onRefreshBenefit)의 반복 호출을 중단시켜요.
PC방 로그인 상태를 종료할 때 호출해요.
콜백의 두 번째 인자
reserved는 향후 페이로드 확장을 위해 자리만 잡아 둔 파라미터로, 현재 SDK 에서는 항상nullptr이에요.
Declaration
void Stove_PCBangLogout(const IStoveTypeBase* param, OnPCBangLogoutCallback onFinished, void* userData);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IStoveTypeBase* | N | 예약된 파라미터예요. 현재 구현은 이 값을 사용하지 않으므로((void)param 처리) nullptr 을 전달해요. |
onFinished | OnPCBangLogoutCallback | Y | 로그아웃 결과를 전달받을 콜백이에요. |
userData | void* | N | 콜백에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnPCBangLogoutCallback)(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
reserved | const IStoveTypeBase* | 향후 페이로드 확장을 위해 콜백의 인자 개수를 미리 맞춰 둔 예약 슬롯이에요. 현재 SDK 에서는 항상 nullptr 이에요. 이후 실제 페이로드가 추가되면 다른 콜백 인자와 동일한 소유권 규칙(SDK 소유, 콜백 동안만 유효, 해제 금지)을 따라요. if (reserved) 로 값 존재 여부를 확인할 수 있어요. |
콜백은 Stove_RunCallback() 을 호출한 스레드에서 실행되며, 로그아웃 결과에 대해 1회만 호출돼요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | onFinished 가 nullptr 이에요 | x | |
| 17 | k_EStoveCommonResultCode_NotInitialized | SDK 가 초기화되지 않았어요 | x | |
| 22 | k_EStoveCommonResultCode_HttpError | 로그아웃 요청의 HTTP 상태 코드가 200 이 아니에요 | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
| 23 | k_EStoveCommonResultCode_ResponseError | 응답에 code/message 필드가 없거나 서버가 비즈니스 오류를 반환했어요 | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
| 25 | k_EStoveCommonResultCode_ResponseValueIsNull | 응답의 value 가 JSON null 이에요 | O | 네트워크 연결이 원활하지 않습니다. 네트워크 상태를 확인하고 다시 실행해 주세요. [확인] |
| 249 | k_EStoveCommonResultCode_NetworkTransportError | 네트워크 전송 계층 예외가 발생했어요 | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 알 수 없는 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 처리된 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
로그인·상태조회와 달리 응답 복호화 단계가 없어 k_EStoveCommonResultCode_ResponseInvalidValueFormat(26) 은 발생하지 않아요.
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | 현재 사용하지 않는 예약 파라미터이므로 nullptr 을 전달하며 별도로 해제할 필요가 없어요. |
콜백의 callbackResult | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
콜백의 reserved | SDK | 현재 항상 nullptr 이에요. 값이 있더라도 해제 금지이며 콜백이 끝나면 무효처리돼요. |
Example
void __cdecl OnLogout(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Stove_PCBangLogout(nullptr, OnLogout, nullptr);
// 게임 루프 안에서 반복 호출해야 콜백이 실행됩니다.
while (isGameRunning)
{
Stove_RunCallback();
}
Notes
- 이 함수는 비동기 함수이며, 콜백은
Stove_RunCallback()을 호출하는 스레드에서 1회 실행돼요. - 콜백의 두 번째 인자
reserved는 항상nullptr인 예약 파라미터예요. 값이 채워지는 시점을 대비해if (reserved)형태로 방어적으로 다루는 것을 권장해요. - Stove_PCBangLogin 의
onRefreshBenefit반복 호출을 멈추려면 이 함수를 호출해야 해요.
See Also
Stove_RestartAppIfNecessary
종류 함수 · 모듈 Base · 버전 3.5.0
Description
PCSDK가 스토브 런처를 거쳐 실행되었는지 확인해요. 런처를 거치지 않았다면 런처를 통해 앱을 재실행하고 현재 프로세스는 종료돼요.
이 함수는 Stove_Initialize()보다 먼저 호출해야 해요. initParam에 담긴 환경(Environment) · 게임 ID · 앱 키 값은 이후 Stove_Initialize() 호출 시 재사용돼요.
재실행이 필요한 경우 현재 프로세스가 종료되므로, 이 함수 호출 이후의 코드가 실행되지 않을 수 있어요.
Declaration
void Stove_RestartAppIfNecessary(const IStoveRestartAppIfNecessaryParam* initParam, OnRestartAppIfNecessaryCallback onFinished, void* userData);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
initParam | IStoveRestartAppIfNecessaryParam* | Y | 환경(Environment) · 게임 ID · 앱 키 등 런처 확인에 필요한 정보예요. |
onFinished | OnRestartAppIfNecessaryCallback | Y | 결과를 받을 콜백이에요. |
userData | void* | N | 콜백에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnRestartAppIfNecessaryCallback)(const IStoveCallbackResult* callbackResult, const IStoveRestartAppIfNecessaryOutcome* outcome);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
outcome | const IStoveRestartAppIfNecessaryOutcome* | 재실행 필요 여부예요. Stove_IStoveRestartAppIfNecessaryOutcome_IsRestartRequired()로 조회해요. |
콜백은 Stove_RunCallback()(또는 Stove_RunCallbackWithTimeout())을 호출한 스레드에서 실행돼요. 재실행이 필요한 경우에도 콜백은 전달돼요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공(IPC 상태가 정상 도달, 또는 직전 호출이 이미 완료된 상태 재확인) | x | |
| 29 | k_EStoveCommonResultCode_AsyncOperationInProgress | 직전 비동기 재시작 요청이 아직 처리 중이에요. | x | |
| 30 | k_EStoveCommonResultCode_BaseUninitialized | 대기 중 IPC 상태가 초기화되지 않은 상태로 전환되었어요. | x | |
| 307 | k_EStoveResultCode_IpcConnectFailed | 런처와의 IPC 연결에 실패했어요. | O | 게임이 스토브 PC 클라이언트를 통해 실행되지 않아 종료됩니다.클라이언트에서 다시 게임을 실행해주세요.클라이언트 미설치 시 스토브 홈페이지에서 설치해주세요.[확인] |
| 308 | k_EStoveResultCode_IpcAesKeyNotReceived | 런처로부터 AES 키를 받지 못했어요. | O | 게임이 스토브 PC 클라이언트를 통해 실행되지 않아 종료됩니다.클라이언트에서 다시 게임을 실행해주세요.클라이언트 미설치 시 스토브 홈페이지에서 설치해주세요.[확인] |
| 309 | k_EStoveResultCode_IpcTimeout | 대기 시간(waitTimeMillisec)을 초과했어요. | O | 게임이 스토브 PC 클라이언트를 통해 실행되지 않아 종료됩니다.클라이언트에서 다시 게임을 실행해주세요.클라이언트 미설치 시 스토브 홈페이지에서 설치해주세요.[확인] |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 알 수 없는 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
아래 코드를 받으면 반드시 게임을 종료해야 해요. 정상 진행이 불가능한 상태예요.
307k_EStoveResultCode_IpcConnectFailed— 런처와의 연결에 실패해 재실행이 필요해요308k_EStoveResultCode_IpcAesKeyNotReceived— 런처와의 통신 준비에 실패해 재실행이 필요해요309k_EStoveResultCode_IpcTimeout— 런처와의 통신이 시간 초과되어 재실행이 필요해요
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
initParam | 호출자 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)initParam) 필수 |
콜백의 callbackResult, outcome | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요 |
Example
IStoveRestartAppIfNecessaryParam* initParam = (IStoveRestartAppIfNecessaryParam*)Stove_CreateParam(k_EStoveBaseTypeKind_RestartAppIfNecessaryParam);
Stove_IStoveRestartAppIfNecessaryParam_SetEnvironment(initParam, L"REAL");
Stove_IStoveRestartAppIfNecessaryParam_SetGameId(initParam, L"YOUR_GAME_ID");
Stove_IStoveRestartAppIfNecessaryParam_SetAppKey(initParam, L"YOUR_APP_KEY");
Stove_RestartAppIfNecessary(initParam, [](const IStoveCallbackResult* callbackResult, const IStoveRestartAppIfNecessaryOutcome* outcome)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
if (!Stove_IStoveRestartAppIfNecessaryOutcome_IsRestartRequired(outcome))
{
// 재실행이 필요 없다면 이어서 Stove_Initialize()를 호출합니다.
}
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}, nullptr);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)initParam);
Notes
Stove_Initialize()보다 먼저 호출해야 해요.- 재실행이 필요하면 런처를 통해 앱이 다시 실행되고 현재 프로세스는 종료돼요.
- 이 함수에서 사용한 환경 · 게임 ID · 앱 키 값은
Stove_Initialize()가 재사용해요.
See Also
Stove_RunCallback
종류 함수 · 모듈 Base · 버전 3.5.0
Description
비동기 API 호출의 결과(콜백 함수)를 처리(dispatch)해요. 게임의 UI(메인) 스레드에서 호출해야 해요.
SDK 전체의 비동기 API 콜백은 모두 이 함수(또는 Stove_RunCallbackWithTimeout)를 통해서만 전달돼요. SDK 내부 스레드가 아니라, 이 함수를 호출한 스레드에서 콜백이 실행돼요.
게임 루프(예: 매 프레임 또는 매 틱)에서 주기적으로 호출해야 해요.
while(true)형태로 이 함수만 반복 호출하는 방식으로 사용하지 않아요.
Declaration
void Stove_RunCallback();
Parameters
없음
Returns
없음
Error Codes
없음
Memory Management
이 함수는 별도의 객체를 생성하거나 반환하지 않아요.
Example
// 게임 루프 예시
while (isGameRunning)
{
// ... 게임 로직 ...
Stove_RunCallback();
// ... 렌더링 등 나머지 루프 로직 ...
}
Notes
- 모든 비동기 API의 콜백은 이 함수를 호출한 스레드에서 실행돼요.
- 게임 루프 안에서 주기적으로 호출해야 콜백이 지연 없이 처리돼요.
- 대기 시간을 지정하려면 Stove_RunCallbackWithTimeout을 사용해요.
See Also
Stove_RunCallbackWithTimeout
종류 함수 · 모듈 Base · 버전 3.5.0
Description
Stove_RunCallback의 타임아웃 버전이에요. timeoutMillisec으로 대기 시간을 지정할 수 있어요.
게임의 UI(메인) 스레드에서 호출해야 하며, 등록된 콜백은 이 함수를 호출한 스레드에서 실행돼요.
Declaration
void Stove_RunCallbackWithTimeout(uint32_t timeoutMillisec);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
timeoutMillisec | uint32_t | Y | 대기 시간(밀리초)예요. |
Returns
없음
Error Codes
없음
Memory Management
이 함수는 별도의 객체를 생성하거나 반환하지 않아요.
Example
// 게임 루프 예시 (최대 10ms 대기)
while (isGameRunning)
{
// ... 게임 로직 ...
Stove_RunCallbackWithTimeout(10);
// ... 렌더링 등 나머지 루프 로직 ...
}
Notes
- 모든 비동기 API의 콜백은 이 함수를 호출한 스레드에서 실행돼요.
- 일반적인 사용에는 Stove_RunCallback을 사용하고, 대기 시간 제어가 필요할 때 이 함수를 사용해요.
See Also
Stove_SendLog
종류 함수 · 모듈 Log · 버전 3.5.0
Description
로그 항목 하나를 STOVE 로그 백엔드로 전송해요. logSendParam 에 담은 값이 그대로 로그 항목이 되어 전송돼요.
로그 기능은 별도의 초기화·종료 API 를 두지 않아요. 수명 관리는 SDK 가 대신하므로, Stove_Initialize() 가 성공한 이후 바로 호출할 수 있어요.
onFinished콜백은 로그가 로컬 DB 에 저장되면 즉시 SUCCESS 로 호출돼요. 실제 서버로의 HTTP 전송은 별도의 내부 재전송 경로에서 처리되며, 그 결과(성공/실패 모두)는 이 콜백에 절대 전달되지 않아요.
Declaration
void Stove_SendLog(const IStoveSendLogParam* logSendParam, OnSendLogCallback onFinished, void* userData);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
logSendParam | const IStoveSendLogParam* | Y | 전송할 로그 항목의 값이에요. Stove_CreateParam(k_EStoveLogTypeKind_SendLogParam) 으로 생성해요. |
onFinished | OnSendLogCallback | Y | 전송 결과를 전달받을 콜백이에요. |
userData | void* | N | 콜백에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnSendLogCallback)(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 전송 호출 결과예요. 로컬 DB 저장 성공 여부만 반영하며, 실제 서버 전송 결과는 반영하지 않아요. |
reserved | const IStoveTypeBase* | 향후 페이로드 확장을 위해 콜백의 인자 개수를 미리 맞춰 둔 예약 슬롯이에요. 현재 SDK 에서는 항상 nullptr 이에요. if (reserved) 로 값 존재 여부를 확인할 수 있어요. |
콜백은 Stove_RunCallback() 을 호출한 스레드에서 실행돼요. Stove_SendLog() 호출 1회당, 로그 항목이 로컬 DB 에 기록(또는 기록 실패)된 시점에 1회 전달돼요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 로컬 DB 에 로그 레코드 삽입까지 성공했어요(실제 서버 전송 완료를 의미하지 않아요) | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | onFinished 가 nullptr 이거나, contents 가 비어있지 않은데 유효한 JSON 이 아니에요 | x | |
| 17 | k_EStoveCommonResultCode_NotInitialized | SDK 가 초기화되지 않았어요 | x | |
| 44 | k_EStoveCommonResultCode_LocalDbWriteFailed | 로컬 DB 에 로그 레코드를 기록하는 데 실패했어요(구 이름: LOCAL_DB_BACKUP_LOG_FAILED) | x | |
| 82 | k_EStoveCommonResultCode_PayloadSizeExceeded | UTF-8 로 인코딩한 로그 콘텐츠가 50KB 를 초과했어요(구 이름: LOG_SIZE_EXCEEDED) | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 알 수 없는 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 처리된 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
k_EStoveCommonResultCode_InvalidParam(5) 은 구 LogSDK 전용 코드였던 INVALID_LOG_PARAMETER(85)가 폐지되고 범용 코드로 흡수된 것이에요.
이 콜백에는 절대 전달되지 않는 코드가 있어요. 실제 서버로의 HTTP 전송은 로컬 DB 저장이 끝난 뒤 별도의 내부 경로에서 처리되며, 그 경로의 실패는 게임 쪽에 별도로 통지되지 않도록 구현되어 있어, HttpError(22)·ResponseError(23)·ResponseValueIsNull(25)·NetworkTransportError(249)·UnmanagedException(253)·ManagedException(254, 요청 계층) 등 서버 통신 관련 실패는 onFinished 로 전달되지 않아요.
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
logSendParam | 호출자 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)logSendParam) 필수. 호출이 반환된 뒤 바로 해제할 수 있어요. |
콜백의 callbackResult | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
콜백의 reserved | SDK | 현재 항상 nullptr 이에요. 값이 있더라도 해제 금지이며 콜백이 끝나면 무효처리돼요. |
Example
IStoveSendLogParam* logSendParam = (IStoveSendLogParam*)Stove_CreateParam(k_EStoveLogTypeKind_SendLogParam);
Stove_IStoveSendLogParam_SetAuid(logSendParam, auid);
Stove_IStoveSendLogParam_SetCuid(logSendParam, cuid);
Stove_IStoveSendLogParam_SetContents(logSendParam, L"{\"event\":\"login\"}");
Stove_SendLog(logSendParam, OnSendLogFinished, nullptr);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)logSendParam);
// ...
void __cdecl OnSendLogFinished(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 로컬 DB 저장이 성공했다는 의미입니다. 실제 서버 전송 결과는 알 수 없습니다.
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
// 게임 루프 안에서 반복 호출해야 콜백이 실행됩니다.
while (isGameRunning)
{
Stove_RunCallback();
}
Notes
onFinished콜백은 실제 서버 전송 결과를 반영하지 않아요. 로그가 로컬 DB 에 저장되는 즉시 SUCCESS 로 호출되며, 실제 HTTP 전송은 뒤이어 별도의 내부 재전송 경로에서 처리돼요. 이 경로의 실패는 사용자 콜백으로 전달되지 않으므로, 이 콜백의 성공 여부를 "서버에 로그가 도착했다"는 뜻으로 오해해서는 안 돼요.- 특정 로그 항목의 값을 모른다면 해당 필드는 채우지 않아도 돼요. 숫자 필드는 기본값 0, 문자열 필드는 빈 값/
nullptr로 남아요. - 로그 기능은
Stove_SendLog()하나만 공개 API 로 제공하며, 초기화·종료는 SDK 가 대신해요. - 콜백의
reserved인자는 항상nullptr인 예약 파라미터예요. 값이 채워지는 시점을 대비해if (reserved)형태로 방어적으로 다루는 것을 권장해요. - 로컬 DB 저장 실패(위 표의
k_EStoveCommonResultCode_LocalDbWriteFailed등)를 제외하면 이 콜백은 사실상 항상 성공을 돌려줘요. 게임 로직을 이 콜백의 결과로 분기하도록 설계하지 않는 것을 권장해요.
See Also
Stove_SetGameProfile
종류 함수 · 모듈 Base · 버전 3.5.0
Description
게임 프로필 정보를 설정하는 동기 함수예요.
Declaration
IStoveResult* Stove_SetGameProfile(const IStoveSetGameProfileParam* gameProfileParams);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
gameProfileParams | const IStoveSetGameProfileParam* | Y | 게임 프로필 정보예요. Stove_CreateParam(k_EStoveBaseTypeKind_SetGameProfileParam)으로 생성해요. |
Returns
| Type | Description |
|---|---|
IStoveResult* | 호출 결과예요. Stove_IStoveResult_IsSuccessful(result)이면 성공이에요. |
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | gameProfileParams가 nullptr | x | |
| 16 | k_EStoveCommonResultCode_BaseNotInitialized | SDK가 초기화되지 않음 | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 알 수 없는 예외가 발생함 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 내부 예외가 발생함 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
gameProfileParams | 호출자 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)gameProfileParams) 필수 |
반환된 IStoveResult* | 호출자 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result) 필수 |
Example
IStoveSetGameProfileParam* gameProfileParams = (IStoveSetGameProfileParam*)Stove_CreateParam(k_EStoveBaseTypeKind_SetGameProfileParam);
Stove_IStoveSetGameProfileParam_SetWorldId(gameProfileParams, L"world_01");
Stove_IStoveSetGameProfileParam_SetCharacterNo(gameProfileParams, 12345);
IStoveResult* result = Stove_SetGameProfile(gameProfileParams);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)gameProfileParams);
Notes
IStoveSetGameProfileParam::GetCharacterNo()는 월드 내 캐릭터 번호예요. 예전StoveGameProfileParams에서 이 필드를 "worldId Length"로 표기한 것은 문서상의 오기였어요.
See Also
Stove_SetLanguage
종류 함수 · 모듈 Base · 버전 3.5.0
Description
PCSDK가 사용할 언어를 설정하는 동기 함수예요.
Declaration
IStoveResult* Stove_SetLanguage(const wchar_t* language);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
language | const wchar_t* | Y | 언어 정보 문자열이에요. |
Returns
| Type | Description |
|---|---|
IStoveResult* | 호출 결과예요. Stove_IStoveResult_IsSuccessful(result)이면 성공이에요. |
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | language가 nullptr이거나, 지원하지 않는 언어 코드임 | x | |
| 16 | k_EStoveCommonResultCode_BaseNotInitialized | SDK가 초기화되지 않음 | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 알 수 없는 예외가 발생함 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 내부 예외가 발생함 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
지원하지 않는 언어 코드일 때의 InvalidParam(5)은 하위 계층(LanguageActor)에서 설정돼요.
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
language | 호출자 | 문자열 인자예요. Destroy 대상이 아니에요. |
반환된 IStoveResult* | 호출자 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result) 필수 |
Example
IStoveResult* result = Stove_SetLanguage(L"ko");
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
Notes
- 이 함수는 동기 함수이며 콜백을 받지 않아요.
Stove_SetPopupDisallowed
종류 함수 · 모듈 View · 버전 3.5.0
Description
이 함수는 disallowed 에 지정한 팝업 식별자(PopupId)를 지정한 기간(Days, 일 단위) 동안 다시 표시되지 않도록 로컬에 기록해요. 팝업을 화면에서 닫는 API가 아니라, 이후 노출 여부를 제어하는 API예요.
SDK 초기화(Stove_Initialize()) 이후에 호출해야 해요.
Declaration
void Stove_SetPopupDisallowed(const IStoveSetPopupDisallowedParam* disallowed,
OnSetPopupDisallowedCallback onFinished, void* userData);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
disallowed | const IStoveSetPopupDisallowedParam* | Y | 억제할 팝업 식별자(PopupId)와 억제 기간(Days)이에요. |
onFinished | OnSetPopupDisallowedCallback | Y | 처리 결과를 전달받을 콜백이에요. |
userData | void* | N | onFinished 에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnSetPopupDisallowedCallback)(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
reserved | const IStoveTypeBase* | 예약된 인자예요. 현재 구현에서는 항상 nullptr 로 전달돼요. |
onFinished 는 Stove_RunCallback() 을 호출한 스레드에서, 처리 결과에 대해 1회 실행돼요.
콜백은 Stove_RunCallback() 을 호출한 스레드에서 실행돼요. SDK 내부 스레드가 아니에요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공(로컬 DB에 기록 완료) | x | |
| 1 | k_EStoveCommonResultCode_Fail | 로컬 DB 쓰기에 실패했어요 | x | |
| 17 | k_EStoveCommonResultCode_NotInitialized | SDK 가 초기화되지 않았어요 | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 관리되지 않는 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 관리되는 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
disallowed | 호출자 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)disallowed) 필수. Stove_SetPopupDisallowed() 호출이 끝나면 곧바로 해제할 수 있어요. |
콜백의 callbackResult | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
콜백의 reserved | SDK(항상 nullptr) | 해제 금지. |
Example
void __cdecl OnSetPopupDisallowedFinished(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
IStoveSetPopupDisallowedParam* disallowed =
(IStoveSetPopupDisallowedParam*)Stove_CreateParam(k_EStoveViewTypeKind_SetPopupDisallowedParam);
Stove_IStoveSetPopupDisallowedParam_SetPopupId(disallowed, 1001);
Stove_IStoveSetPopupDisallowedParam_SetDays(disallowed, 7);
Stove_SetPopupDisallowed(disallowed, OnSetPopupDisallowedFinished, nullptr);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)disallowed);
// 게임 루프 안에서 반복 호출해야 콜백이 실행됩니다.
while (isGameRunning)
{
Stove_RunCallback();
}
Notes
- 이 함수는 비동기 함수이며, 콜백은
Stove_RunCallback()을 호출하는 스레드에서 실행돼요. - 다른 5개 팝업 API(오토·수동·뉴스·쿠폰·본인인증)와 달리 콜백을 1개(
onFinished)만 받아요. 화면에 표시 중인 웹뷰를 닫는 기능이 아니므로onDestroy개념이 없어요. - 억제 정보는 로컬 DB에 저장되며, Stove_AutoPopup 등 팝업 조회 API가 목록을 서버에서 받아온 뒤 필터링할 때 참조해요.
See Also
Stove_ShutdownNotification
종류 함수 · 모듈 Base · 버전 3.5.0
Description
셧다운 적용 대상 사용자에게 셧다운 알림을 콜백으로 전달해요.
이 API는 한국 전용이 아니에요. 셧다운 정책이 적용된 계정이라면 해외 사용자에게도 동작해요.
Declaration
void Stove_ShutdownNotification(const IStoveTypeBase* param, OnShutdownNotificationCallback onFinished, void* userData);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IStoveTypeBase* | N | 예약된 인자로, 전용 TypeKind는 정의되어 있지 않아요. |
onFinished | OnShutdownNotificationCallback | Y | 결과를 받을 콜백이에요. |
userData | void* | N | 콜백에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnShutdownNotificationCallback)(const IStoveCallbackResult* callbackResult, const IStoveShutdownInfo* shutdown);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
shutdown | const IStoveShutdownInfo* | 셧다운 알림 정보예요. 알림 메시지(GetMsg()), 메시지 노출 시간(GetExposureTime(), 초 단위), 셧다운까지 남은 시간(GetInadvanceMinutes(), 분 단위)을 제공해요. |
콜백은 Stove_RunCallback()(또는 Stove_RunCallbackWithTimeout())을 호출한 스레드에서 실행돼요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | onFinished가 nullptr | x | |
| 16 | k_EStoveCommonResultCode_BaseNotInitialized | SDK가 초기화되지 않음 | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 알 수 없는 예외가 발생함 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 내부 예외가 발생함 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
이 API는 국가 제한(NotSupportedCountry) 조건이 없어요. 셧다운 적용 계정이면 해외에서도 동일하게 동작해요.
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | 전달했다면 Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param) 필수 |
콜백의 callbackResult, shutdown | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
Example
void OnShutdownNotification(const IStoveCallbackResult* callbackResult, const IStoveShutdownInfo* shutdown)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
const wchar_t* msg = Stove_IStoveShutdownInfo_GetMsg(shutdown);
int32_t inadvanceMinutes = Stove_IStoveShutdownInfo_GetInadvanceMinutes(shutdown);
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
Stove_ShutdownNotification(nullptr, OnShutdownNotification, nullptr);
// 게임 루프에서 주기적으로 호출해야 콜백이 전달됩니다.
Stove_RunCallback();
Notes
- 한국 전용 API가 아니에요. 셧다운 정책이 적용된 계정이면 해외에서도 동작해요.
- 이 콜백은 1회성이 아니에요. 한 번 등록해 두면, 서버가 내려준 사전 안내 시점(예: 셧다운 30분 전, 10분 전 등)마다 그리고 실제 셧다운 시각이 되었을 때 각각 한 번씩, 서버가 지정한 안내 횟수만큼 반복 호출돼요.
See Also
Stove_StartPurchase
종류 함수 · 모듈 IAP · 버전 3.5.0
Description
params로 전달한 주문 상품 목록에 대해 구매 절차를 시작해요. 진행 방식은 params에 담긴 IStovePurchaseParam의 Operation(EStovePurchaseOperation) 값에 따라 달라져요.
Default: Stove Webview를 사용하지 않아요.onFinished로 전달되는 결과에서 일회성 결제 URL을 받아 호출자가 직접 결제 페이지를 열어야 하며, 결제 후에는 Stove_ConfirmPurchase를 호출해 구매를 확정해야 해요.WithWebView: Stove 결제 페이지를 Stove Webview 안에서 열어요. 이 경우에도 결제가 끝나면 호출자가Stove_ConfirmPurchase를 호출해 구매를 확정해야 해요.WithWebViewAndConfirmResult: Stove 결제 페이지를 Stove Webview 안에서 열고, 결제 성공 시 SDK가 자동으로Stove_ConfirmPurchase를 호출하여 확정된 구매 결과를onFinished로 돌려줘요. 이 경우 호출자가 별도로Stove_ConfirmPurchase를 호출할 필요가 없어요.
웹뷰가 아예 생성되지 않고 호출이 종료되는 모든 실패(미초기화, 파라미터 검증 실패, 예외 등)에서
onDestroy가PopupNotCreated(33)로 1회 함께 호출돼요. 자세한 내용은 오류코드와 콜백 항목을 참고하세요.
Declaration
void Stove_StartPurchase(const IStoveStartPurchaseParam* params,
OnStartPurchaseCallback onFinished, OnIAPPopupDestroyCallback onDestroy,
void* userData1, void* userData2);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
params | const IStoveStartPurchaseParam* | Y | 주문 상품 목록과 구매 동작 파라미터예요. |
onFinished | OnStartPurchaseCallback | Y | 구매 결과를 받을 콜백이에요. |
onDestroy | OnIAPPopupDestroyCallback | N | SDK가 만든 팝업이 모두 닫혔을 때 호출되는 콜백이에요. |
userData1 | void* | N | onFinished에 그대로 전달되는 사용자 데이터예요. |
userData2 | void* | N | onDestroy에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnStartPurchaseCallback)(const IStoveCallbackResult* callbackResult, const IStoveStartPurchaseOutcome* outcome);
typedef void(__cdecl* OnIAPPopupDestroyCallback)(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
outcome | const IStoveStartPurchaseOutcome* | 구매 결과예요(옛 인터페이스의 IStovePurchaseResult가 이 이름으로 바뀌었어요). 어떤 필드가 채워지는지는 Operation 값에 따라 달라요(개요 참고). |
reserved | const IStoveTypeBase* | 예약된 매개변수예요. 현재 항상 nullptr이에요. |
두 콜백 모두 Stove_RunCallback()을 호출한 스레드에서 실행돼요.
onFinished는 호출 1건당 1회만 전달돼요.onDestroy는 이 호출로 생성된 팝업이 모두 닫힌 뒤 1회 전달돼요. 팝업이 아예 생성되지 않고 호출이 종료된 경우에도 결과 코드PopupNotCreated(33)로 1회 호출돼요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 17 | k_EStoveCommonResultCode_NotInitialized | 결제 기능이 초기화되지 않았어요. | x | |
| 60 | k_EStoveCommonResultCode_ViewUiNotInitialized | Operation이 Default가 아니어서 결제 웹뷰를 열어야 하는데, 웹뷰/팝업 UI 서브시스템이 초기화되지 않았어요. | x | |
| 65 | k_EStoveCommonResultCode_WebviewCloseAllFail | 새 결제 웹뷰를 열기 전, 기존에 열려 있던 IAP 웹뷰를 모두 닫는 데 실패했어요. | x | |
| 62 | k_EStoveCommonResultCode_WebviewCreateFail | 결제 웹뷰 생성 자체가 실패했어요. | x | |
| 63 | k_EStoveCommonResultCode_WebviewLoadUrlFail | 결제 웹뷰에서 결제 페이지 URL 로드에 실패했어요. | x | |
| 34 | k_EStoveCommonResultCode_WebviewClosedBeforeComplete | WithWebViewAndConfirmResult 동선에서 결제 완료 통지를 받기 전에 웹뷰가 닫혔어요(사용자 취소 등). | O | 구매가 정상적으로 완료되지 않았습니다. 다시 시도해 주세요. [확인] |
| 66 | k_EStoveCommonResultCode_WebviewCloseFail | 웹뷰가 정상적으로 닫히는 과정에서 내부 닫기 처리가 실패했어요. onFinished가 아니라 onDestroy에 실려요. | x | |
| 80 | k_EStoveCommonResultCode_ParameterLengthExceeded | ServiceTxnNo가 50자, 또는 ExtraData가 500자를 초과했어요. | O | 결제 정보가 유효하지 않아 결제를 진행할 수 없습니다. 다시 시도해 주세요. [확인] |
| 81 | k_EStoveCommonResultCode_InvalidJsonString | ExtraData가 비어 있지 않은데 JSON 형식이 아니에요. | O | 결제 정보가 유효하지 않아 결제를 진행할 수 없습니다. 다시 시도해 주세요. [확인] |
| 503 | k_EStoveResultCode_InvalidOrderProductInformation | 주문 상품 중 수량이 0 이하이거나 판매가(SalePrice)가 음수인 항목이 있어요. | O | 결제 정보가 유효하지 않아 결제를 진행할 수 없습니다. 다시 시도해 주세요. [확인] |
| 252 | k_EStoveCommonResultCode_NotImplemented | IStovePurchaseParam의 Operation 값이 알려진 값(Default/WithWebView/WithWebViewAndConfirmResult)이 아니에요. | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 관리되지 않는 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 관리되는 예외가 발생했어요(로그인 토큰 등 내부 엔티티 누락 포함). | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 33 | k_EStoveCommonResultCode_PopupNotCreated | 팝업이 생성되지 않고 호출이 종료되었어요. onDestroy에만 전달돼요. | x |
네트워크/서버 응답 오류는 하위 HTTP 계층에서 전달돼요.
Operation == WithWebViewAndConfirmResult인 경우, 결제 성공 후 SDK가 자동으로 Stove_ConfirmPurchase를 호출해요. 이때 확정이 실패하면 그 결과 코드가 그대로 이 함수의onFinished에 전달될 수 있어요.Stove_ConfirmPurchase문서의 오류코드도 함께 참고하세요.
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
params | 호출자 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)params) 필수. 호출이 반환된 뒤 해제해요. |
params에 담긴 각 IStoveOrderProductParam | 호출자 | 호출자가 소유권을 유지하며, 호출이 반환된 뒤 각각 Destroy() 해야 해요. |
params에 담긴 IStovePurchaseParam | 호출자 | 호출자가 소유권을 유지하며, 호출이 반환된 뒤 Destroy() 해야 해요. |
콜백의 callbackResult | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
콜백의 outcome | SDK | 해제 금지. 콜백이 끝나면 무효처리되며, 필요한 값은 콜백 안에서 복사해 두어야 해요. |
Example
void __cdecl OnStartPurchaseFinished(const IStoveCallbackResult* callbackResult, const IStoveStartPurchaseOutcome* outcome)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
// Operation == Default 인 경우 TempPaymentUrl 로 결제 페이지를 열고,
// 결제 완료 후 Stove_ConfirmPurchase() 를 호출해 구매를 확정해야 합니다.
int64_t txnMasterNo = Stove_IStoveStartPurchaseOutcome_GetTxnMasterNo(outcome);
const wchar_t* tempPaymentUrl = Stove_IStoveStartPurchaseOutcome_GetTempPaymentUrl(outcome);
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
void __cdecl OnStartPurchasePopupDestroyed(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved)
{
// 구매 과정에서 열린 팝업이 모두 닫혔을 때 로직을 구현해 주세요.
// 팝업이 생성되지 않았던 경우(PopupNotCreated, 33)도 이 콜백으로 전달되며 무시해도 안전합니다.
}
// 호출
IStoveOrderProductParam* orderProduct = (IStoveOrderProductParam*)Stove_CreateParam(k_EStoveIAPTypeKind_OrderProductParam);
Stove_IStoveOrderProductParam_SetProductId(orderProduct, productId);
Stove_IStoveOrderProductParam_SetSalePrice(orderProduct, salePrice);
Stove_IStoveOrderProductParam_SetQuantity(orderProduct, 1);
IStovePurchaseParam* purchaseParam = (IStovePurchaseParam*)Stove_CreateParam(k_EStoveIAPTypeKind_PurchaseParam);
Stove_IStovePurchaseParam_SetOperation(purchaseParam, k_EStovePurchaseOperation_Default);
IStoveOrderProductParam* orderProducts[] = { orderProduct };
IStoveStartPurchaseParam* params = (IStoveStartPurchaseParam*)Stove_CreateParam(k_EStoveIAPTypeKind_StartPurchaseParam);
Stove_IStoveStartPurchaseParam_SetProducts(params, orderProducts, 1);
Stove_IStoveStartPurchaseParam_SetPurchaseParam(params, purchaseParam);
Stove_StartPurchase(params, OnStartPurchaseFinished, OnStartPurchasePopupDestroyed, nullptr, nullptr);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)params);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)purchaseParam);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)orderProduct);
Notes
- 이 함수는 비동기 함수이며 결과는
onFinished콜백으로만 전달돼요. Operation이Default또는WithWebView로 시작한 구매는 반드시 Stove_ConfirmPurchase를 호출해 확정해야 해요.WithWebViewAndConfirmResult는 SDK가 자동으로 확정을 처리해요.outcome의PurchaseProgress(EStovePurchaseProgress) 값으로 결제창을 직접 띄워야 하는지 판단할 수 있어요.- 옛 인터페이스에서는
params·상품·옵션 객체를 생성할 때 값 이름에 밑줄이 없었고(k_EStoveIAPTypeKindStartPurchaseParam), 결과 타입 이름도IStovePurchaseResult였어요. 현재는 각각k_EStoveIAPTypeKind_StartPurchaseParam,IStoveStartPurchaseOutcome으로 바뀌었어요.
See Also
- Stove_ConfirmPurchase
- Stove_FetchProducts
- EStovePurchaseOperation
- IStoveStartPurchaseParam
- IStoveStartPurchaseOutcome
Stove_Uninitialize
종류 함수 · 모듈 Base · 버전 3.5.0
Description
SDK를 정리(종료)해요. Stove_Initialize()와 짝을 이루는 함수예요.
함수 이름은 대문자
I가 아니라 소문자i를 쓰는Stove_Uninitialize예요. 구 인터페이스의Base_UnInitialize(대문자 I)와 표기가 달라요.
Declaration
IStoveResult* Stove_Uninitialize();
Parameters
없음
Returns
| Type | Description |
|---|---|
IStoveResult* | 호출 결과예요. Stove_IStoveResult_GetResultCode()가 0이면 성공이에요. |
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 16 | k_EStoveCommonResultCode_BaseNotInitialized | 아직 초기화되지 않은 상태에서 호출했어요. | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 알 수 없는 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 예외가 발생했어요. | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
전체 목록: EStoveCommonResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
반환된 IStoveResult* | 호출자 | Stove_IStoveTypeBase_Destroy() 필수 |
Example
IStoveResult* result = Stove_Uninitialize();
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
Notes
Stove_Initialize()와 짝을 이루는 종료 함수예요.- 실패로 일부 모듈만 초기화된 상태를 정리하고
Stove_Initialize()를 다시 시도할 때도 이 함수를 사용해요. BASE_NOT_INITIALIZED가 반환되어도 내부 정리 루틴은 계속 진행돼요(로그만 남기고 종료 처리를 이어감).
See Also
Stove_VerifyIdentificationPopup
종류 함수 · 모듈 View · 버전 3.5.0
Description
이 함수는 본인 인증 웹뷰 팝업을 표시해요. param 의 CompareIdentifier 값(IStoveVerifyIdentificationPopupParam::GetCompareIdentifier())에 따라, 인증된 식별자를 현재 로그인한 사용자와 비교할지 여부가 결정돼요.
SDK 초기화(Stove_Initialize()) 이후에 호출해야 해요. 인증이 성공하면 onDestroy 콜백으로 전달되는 IStoveVerifyIdentificationPopupDestroyInfo 에서 발급된 SIM 키를 꺼낼 수 있어요.
이 API는 한국 전용이에요. 로그인한 사용자의 GDS 국가 코드가
"kr"(대소문자 무시)이 아니면k_EStoveCommonResultCode_NotSupportedCountry(31)로 실패해요.
Declaration
void Stove_VerifyIdentificationPopup(const IStoveVerifyIdentificationPopupParam* param,
OnViewPopupCallback onFinished,
OnVerifyIdentificationPopupDestroyCallback onDestroy,
void* userData1, void* userData2);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IStoveVerifyIdentificationPopupParam* | Y | 웹뷰 표시 모드, 식별자 비교 여부(CompareIdentifier) 파라미터예요. |
onFinished | OnViewPopupCallback | Y | 팝업 생성 결과를 전달받을 콜백이에요. |
onDestroy | OnVerifyIdentificationPopupDestroyCallback | N | 팝업(웹뷰)이 닫힌 뒤 전달받을 콜백이에요. 발급된 SIM 키를 함께 전달해요. 생략하면 결과를 받을 수 없어요. |
userData1 | void* | N | onFinished 에 그대로 전달되는 사용자 데이터예요. |
userData2 | void* | N | onDestroy 에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnViewPopupCallback)(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved);
typedef void(__cdecl* OnVerifyIdentificationPopupDestroyCallback)(const IStoveCallbackResult* callbackResult, const IStoveVerifyIdentificationPopupDestroyInfo* info);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
reserved | const IStoveTypeBase* | onFinished 전용 인자예요. 예약된 인자이며 현재 구현에서는 항상 nullptr 로 전달돼요. |
info | const IStoveVerifyIdentificationPopupDestroyInfo* | onDestroy 전용 인자예요. Stove_IStoveVerifyIdentificationPopupDestroyInfo_GetSimKey(info) 로 발급된 SIM 키를 조회해요. 인증에 실패했거나 키를 사용할 수 없으면 빈 문자열이에요. |
두 콜백 모두 Stove_RunCallback() 을 호출한 스레드에서 실행돼요.
onFinished는 팝업 생성 결과에 대해 1회 전달돼요.onDestroy는 웹뷰가 완전히 닫힌 뒤 1회 전달돼요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 17 | k_EStoveCommonResultCode_NotInitialized | SDK 가 초기화되지 않았어요 | x | |
| 31 | k_EStoveCommonResultCode_NotSupportedCountry | 로그인한 사용자의 GDS 국가 코드가 한국(kr)이 아니에요 | x | |
| 60 | k_EStoveCommonResultCode_ViewUiNotInitialized | View UI 서브시스템이 초기화되지 않았어요(방어적 코드 경로로, 정상 흐름에서는 발생하지 않아요) | x | |
| 62 | k_EStoveCommonResultCode_WebviewCreateFail | 웹뷰 생성에 실패했어요(팝업이 여러 개일 때 일부만 생성 실패한 경우 포함) | x | |
| 63 | k_EStoveCommonResultCode_WebviewLoadUrlFail | 웹뷰에서 URL 로드에 실패했어요 | x | |
| 65 | k_EStoveCommonResultCode_WebviewCloseAllFail | 팝업 생성 전 기존 웹뷰를 일괄 닫는 데 실패했어요 | x | |
| 66 | k_EStoveCommonResultCode_WebviewCloseFail | onDestroy 시점에 웹뷰가 정상적으로 닫히지 않았어요 | x | |
| 67 | k_EStoveCommonResultCode_NoPopupData | 표시할 본인 인증 팝업 데이터가 없어요 | O | 팝업 설정 정보가 존재하지 않아 표시할 창이 없습니다. [확인] |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 관리되지 않는 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 관리되는 예외가 발생했어요 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param) 필수. Stove_VerifyIdentificationPopup() 호출이 끝나면 곧바로 해제할 수 있어요. |
콜백의 callbackResult | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
콜백의 reserved | SDK(항상 nullptr) | 해제 금지. |
콜백의 info(SIM 키 포함) | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. SIM 키를 더 오래 보관해야 한다면 콜백 안에서 문자열을 복사해 두어야 해요. |
Example
void __cdecl OnVerifyIdentificationPopupFinished(const IStoveCallbackResult* callbackResult, const IStoveTypeBase* reserved)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
void __cdecl OnVerifyIdentificationPopupDestroyed(const IStoveCallbackResult* callbackResult,
const IStoveVerifyIdentificationPopupDestroyInfo* info)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
const wchar_t* simKey = Stove_IStoveVerifyIdentificationPopupDestroyInfo_GetSimKey(info);
// simKey는 콜백이 끝나면 무효처리되므로, 더 오래 보관하려면 여기서 복사해 두어야 합니다.
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
IStoveVerifyIdentificationPopupParam* param =
(IStoveVerifyIdentificationPopupParam*)Stove_CreateParam(k_EStoveViewTypeKind_VerifyIdentificationPopupParam);
Stove_IStoveVerifyIdentificationPopupParam_SetWebViewMode(param, k_EStoveWebViewMode_Internal);
Stove_IStoveVerifyIdentificationPopupParam_SetCompareIdentifier(param, true);
Stove_VerifyIdentificationPopup(param, OnVerifyIdentificationPopupFinished, OnVerifyIdentificationPopupDestroyed, nullptr, nullptr);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param);
// 게임 루프 안에서 반복 호출해야 콜백이 실행됩니다.
while (isGameRunning)
{
Stove_RunCallback();
}
Notes
- 이 함수는 비동기 함수이며, 두 콜백은
Stove_RunCallback()을 호출하는 스레드에서 실행돼요. - 웹뷰가 아예 만들어지지 못하고 호출이 조기 종료되는 경우(예: 미초기화, 미지원 국가), 실패 사유는
onFinished로만 전달돼요. 이 경우onDestroy는 호출되지 않으므로,onDestroy가 오지 않았다고 해서 웹뷰가 아직 열려 있다고 판단해서는 안 돼요. - 다른 팝업 API와 달리
onDestroy콜백 타입이OnVerifyIdentificationPopupDestroyCallback이며, 두 번째 인자로 항상 nullptr 인reserved대신 SIM 키를 담은 IStoveVerifyIdentificationPopupDestroyInfo 를 전달해요. - 한국(KR) 계정이 아니면 항상
k_EStoveCommonResultCode_NotSupportedCountry(31)로 실패하므로, 다른 국가 계정에는 이 API 자체를 호출하지 않도록 게임 클라이언트에서 분기하는 것을 권장해요.
See Also
- IStoveVerifyIdentificationPopupParam
- IStoveVerifyIdentificationPopupDestroyInfo
- Stove_AutoPopup
- EStoveWebViewMode
Stove_VietnamAgeRatingNotification
종류 함수 · 모듈 Base · 버전 3.5.0
Description
베트남 연령 등급 안내 정보를 콜백으로 전달해요. 베트남 전용 API예요.
1회성 콜백이에요. 렌더링이 가능한 시점 이후에 호출해야 해요.
Declaration
void Stove_VietnamAgeRatingNotification(const IStoveTypeBase* param, OnVietnamAgeRatingNotificationCallback onFinished, void* userData);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IStoveTypeBase* | N | 예약된 인자로, 전용 TypeKind는 정의되어 있지 않아요. |
onFinished | OnVietnamAgeRatingNotificationCallback | Y | 결과를 받을 콜백이에요. |
userData | void* | N | 콜백에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnVietnamAgeRatingNotificationCallback)(const IStoveCallbackResult* callbackResult, const IStoveVietnamAgeRatingInfo* ageRatingInfo);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
ageRatingInfo | const IStoveVietnamAgeRatingInfo* | 연령 등급 오버레이 정보예요. 오버레이 표시 상태(GetOverlayMode()), 오버레이 색상 종류(GetOverlayType(), 0=Black·1=White), 오버레이 크기(GetOverlayScale(), 0.0 ~ 1.0), 오버레이 투명도(GetOverlayOpacity(), 0.0 ~ 1.0), 게임 등급(GetAgeRating(), 0=전체이용가·12=12세·16=16세·18=18세), 안내 메시지(GetMsg()), 표시 위치 X·Y(GetDisplayPositionX()/GetDisplayPositionY(), 화면 좌상단 기준 0.0 ~ 1.0), 폰트 선택용 언어 코드(GetLanguage())를 제공해요. |
콜백은 Stove_RunCallback()(또는 Stove_RunCallbackWithTimeout())을 호출한 스레드에서 실행돼요. 1회성 콜백이며, 렌더링이 가능한 시점 이후에 호출해야 해요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | onFinished가 nullptr | x | |
| 16 | k_EStoveCommonResultCode_BaseNotInitialized | SDK가 초기화되지 않음 | x | |
| 31 | k_EStoveCommonResultCode_NotSupportedCountry | 로그인 계정의 GDS 국가 코드가 베트남(vn)이 아님 | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 알 수 없는 예외가 발생함 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 내부 예외가 발생함 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | 전달했다면 Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param) 필수 |
콜백의 callbackResult, ageRatingInfo | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
Example
void OnVietnamAgeRatingNotification(const IStoveCallbackResult* callbackResult, const IStoveVietnamAgeRatingInfo* ageRatingInfo)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
int32_t overlayMode = Stove_IStoveVietnamAgeRatingInfo_GetOverlayMode(ageRatingInfo);
const wchar_t* msg = Stove_IStoveVietnamAgeRatingInfo_GetMsg(ageRatingInfo);
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
// 렌더링이 가능한 시점 이후에 1회 호출합니다.
Stove_VietnamAgeRatingNotification(nullptr, OnVietnamAgeRatingNotification, nullptr);
// 게임 루프에서 주기적으로 호출해야 콜백이 전달됩니다.
Stove_RunCallback();
Notes
- 베트남 전용 API예요.
- 1회성 콜백이며, 렌더링이 가능한 시점 이후에 호출해야 해요.
See Also
Stove_VietnamOverimmersionNotification
종류 함수 · 모듈 Base · 버전 3.5.0
Description
베트남 과몰입 방지 안내 정보를 콜백으로 전달해요. 베트남 전용 API예요.
1회성 콜백이에요. 렌더링이 가능한 시점 이후에 호출해야 해요.
Declaration
void Stove_VietnamOverimmersionNotification(const IStoveTypeBase* param, OnVietnamOverimmersionNotificationCallback onFinished, void* userData);
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
param | const IStoveTypeBase* | N | 예약된 인자로, 전용 TypeKind는 정의되어 있지 않아요. |
onFinished | OnVietnamOverimmersionNotificationCallback | Y | 결과를 받을 콜백이에요. |
userData | void* | N | 콜백에 그대로 전달되는 사용자 데이터예요. |
Returns
없음
Callback
typedef void(__cdecl* OnVietnamOverimmersionNotificationCallback)(const IStoveCallbackResult* callbackResult, const IStoveVietnamOverimmersionInfo* overimmersionInfo);
| Name | Type | Description |
|---|---|---|
callbackResult | const IStoveCallbackResult* | 호출 결과예요. |
overimmersionInfo | const IStoveVietnamOverimmersionInfo* | 과몰입 방지 오버레이 정보예요. 오버레이 표시 상태(GetOverlayMode()), 오버레이 색상 종류(GetOverlayType(), 0=Black·1=White), 오버레이 크기(GetOverlayScale(), 0.0 ~ 1.0), 오버레이 투명도(GetOverlayOpacity(), 0.0 ~ 1.0), 게임 등급(GetAgeRating(), 0=전체이용가·12=12세·16=16세·18=18세), 경고 메시지(GetMsg()), 서식 태그(<b>, <color=#RRGGBBAA> 등)가 포함된 서식 메시지(GetStyledMsg()), 누적 게임 시간(GetElapsedMinutes(), 분 단위), 메시지 노출 시간(GetExposureTime(), 초 단위), 확장 애니메이션 시간(GetExpandAnimationTime(), 초 단위), 표시 위치 X·Y(GetDisplayPositionX()/GetDisplayPositionY(), 화면 좌상단 기준 0.0 ~ 1.0), 폰트 선택용 언어 코드(GetLanguage())를 제공해요. |
콜백은 Stove_RunCallback()(또는 Stove_RunCallbackWithTimeout())을 호출한 스레드에서 실행돼요. 1회성 콜백이며, 렌더링이 가능한 시점 이후에 호출해야 해요.
Error Codes
| Code | Name | Description | Show to User | In-Game Message |
|---|---|---|---|---|
| 0 | k_EStoveCommonResultCode_Success | 성공 | x | |
| 5 | k_EStoveCommonResultCode_InvalidParam | onFinished가 nullptr | x | |
| 16 | k_EStoveCommonResultCode_BaseNotInitialized | SDK가 초기화되지 않음 | x | |
| 31 | k_EStoveCommonResultCode_NotSupportedCountry | 로그인 계정의 GDS 국가 코드가 베트남(vn)이 아님 | x | |
| 253 | k_EStoveCommonResultCode_UnmanagedException | 실행 중 알 수 없는 예외가 발생함 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
| 254 | k_EStoveCommonResultCode_ManagedException | 실행 중 내부 예외가 발생함 | O | 일시적으로 문제가 발생했습니다. 다시 시도해 주세요. [확인] |
전체 목록: EStoveCommonResultCode, EStoveResultCode
Memory Management
| Object | Owner | Release |
|---|---|---|
param | 호출자 | 전달했다면 Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)param) 필수 |
콜백의 callbackResult, overimmersionInfo | SDK | 해제 금지. 콜백이 끝나면 무효처리돼요. |
Example
void OnVietnamOverimmersionNotification(const IStoveCallbackResult* callbackResult, const IStoveVietnamOverimmersionInfo* overimmersionInfo)
{
IStoveResult* result = Stove_IStoveCallbackResult_GetResult(callbackResult);
if (Stove_IStoveResult_IsSuccessful(result))
{
// 성공 시 로직을 구현해 주세요.
const wchar_t* styledMsg = Stove_IStoveVietnamOverimmersionInfo_GetStyledMsg(overimmersionInfo);
int32_t elapsedMinutes = Stove_IStoveVietnamOverimmersionInfo_GetElapsedMinutes(overimmersionInfo);
}
else
{
// 실패 시 로직을 구현해 주세요.
}
}
// 렌더링이 가능한 시점 이후에 1회 호출합니다.
Stove_VietnamOverimmersionNotification(nullptr, OnVietnamOverimmersionNotification, nullptr);
// 게임 루프에서 주기적으로 호출해야 콜백이 전달됩니다.
Stove_RunCallback();
Notes
- 베트남 전용 API예요.
- 1회성 콜백이며, 렌더링이 가능한 시점 이후에 호출해야 해요.