From 683c656dd87e82ec9e2d05f72a7b7e1c7269bfd6 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sat, 15 Jun 2013 18:21:33 +0000 Subject: ProtoBroadcastAck - unified helper for all protocols git-svn-id: http://svn.miranda-ng.org/main/trunk@4962 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/AimOscar/src/avatars.cpp | 6 +++--- protocols/AimOscar/src/connection.cpp | 6 +++--- protocols/AimOscar/src/direct_connect.cpp | 6 +++--- protocols/AimOscar/src/file.cpp | 20 ++++++++++---------- protocols/AimOscar/src/proto.cpp | 14 +++++++------- protocols/AimOscar/src/proto.h | 2 -- protocols/AimOscar/src/proxy.cpp | 10 +++++----- protocols/AimOscar/src/server.cpp | 14 +++++++------- protocols/AimOscar/src/thread.cpp | 2 +- protocols/AimOscar/src/utility.cpp | 7 +------ 10 files changed, 40 insertions(+), 47 deletions(-) (limited to 'protocols/AimOscar') diff --git a/protocols/AimOscar/src/avatars.cpp b/protocols/AimOscar/src/avatars.cpp index 26cabfb9a8..721488c6f2 100644 --- a/protocols/AimOscar/src/avatars.cpp +++ b/protocols/AimOscar/src/avatars.cpp @@ -75,7 +75,7 @@ void CAimProto::avatar_request_handler(HANDLE hContact, char* hash, unsigned cha setByte(hContact, AIM_KEY_AHT, type); setString(hContact, AIM_KEY_AH, hash); - sendBroadcast(hContact, ACKTYPE_AVATAR, ACKRESULT_STATUS, NULL, 0); + ProtoBroadcastAck(hContact, ACKTYPE_AVATAR, ACKRESULT_STATUS, NULL, 0); } } else @@ -85,7 +85,7 @@ void CAimProto::avatar_request_handler(HANDLE hContact, char* hash, unsigned cha deleteSetting(hContact, AIM_KEY_AHT); deleteSetting(hContact, AIM_KEY_AH); - sendBroadcast(hContact, ACKTYPE_AVATAR, ACKRESULT_STATUS, NULL, 0); + ProtoBroadcastAck(hContact, ACKTYPE_AVATAR, ACKRESULT_STATUS, NULL, 0); } } mir_free(saved_hash); @@ -123,7 +123,7 @@ void CAimProto::avatar_retrieval_handler(const char* sn, const char* hash, const else LOG("AIM sent avatar of zero length for %s.(Usually caused by repeated request for the same icon)", sn); - sendBroadcast(AI.hContact, ACKTYPE_AVATAR, res ? ACKRESULT_SUCCESS : ACKRESULT_FAILED, &AI, 0); + ProtoBroadcastAck(AI.hContact, ACKTYPE_AVATAR, res ? ACKRESULT_SUCCESS : ACKRESULT_FAILED, &AI, 0); } int detect_image_type(const char* stream, const TCHAR* &type_ret) diff --git a/protocols/AimOscar/src/connection.cpp b/protocols/AimOscar/src/connection.cpp index 216821a790..a7fb998ca1 100644 --- a/protocols/AimOscar/src/connection.cpp +++ b/protocols/AimOscar/src/connection.cpp @@ -147,11 +147,11 @@ void CAimProto::aim_connection_authorization(void) return; case 2: - sendBroadcast(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_WRONGPASSWORD); + ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_WRONGPASSWORD); goto exit; case 3: - sendBroadcast(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_NOSERVER); + ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_NOSERVER); goto exit; } } @@ -271,7 +271,7 @@ void __cdecl CAimProto::aim_protocol_negotiation( void* ) } else if (flap.cmp(0x04)) { - sendBroadcast(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_OTHERLOCATION); + ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_OTHERLOCATION); LOG("Connection Negotiation Thread Ending: Flap 0x04"); goto exit; } diff --git a/protocols/AimOscar/src/direct_connect.cpp b/protocols/AimOscar/src/direct_connect.cpp index 4552b461cf..f6d996ea37 100644 --- a/protocols/AimOscar/src/direct_connect.cpp +++ b/protocols/AimOscar/src/direct_connect.cpp @@ -22,7 +22,7 @@ void __cdecl CAimProto::aim_dc_helper(void* param) //only called when we are ini { file_transfer *ft = (file_transfer*)param; - sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTED, ft, 0); + ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTED, ft, 0); NETLIBPACKETRECVER packetRecv = {0}; packetRecv.cbSize = sizeof(packetRecv); @@ -42,7 +42,7 @@ void __cdecl CAimProto::aim_dc_helper(void* param) //only called when we are ini if (result == 0) { - sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, ft, 0); + ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, ft, 0); } else { @@ -60,7 +60,7 @@ void __cdecl CAimProto::aim_dc_helper(void* param) //only called when we are ini } } aim_file_ad(hServerConn, seqno, ft->sn, ft->icbm_cookie, true, 0); - sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); + ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); } ft_list.remove_by_ft(ft); diff --git a/protocols/AimOscar/src/file.cpp b/protocols/AimOscar/src/file.cpp index 12ef935cd7..8cb4dcc4ca 100644 --- a/protocols/AimOscar/src/file.cpp +++ b/protocols/AimOscar/src/file.cpp @@ -197,7 +197,7 @@ int CAimProto::sending_file(file_transfer *ft, HANDLE hServerPacketRecver, NETLI tSelect.cbSize = sizeof(tSelect); tSelect.hReadConns[0] = ft->hConn; - sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&ft->pfts); + ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&ft->pfts); clock_t lNotify = clock(); for (;;) @@ -212,13 +212,13 @@ int CAimProto::sending_file(file_transfer *ft, HANDLE hServerPacketRecver, NETLI if (clock() >= lNotify) { - sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&ft->pfts); + ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&ft->pfts); if (CallService(MS_NETLIB_SELECT, 0, (LPARAM)&tSelect)) break; lNotify = clock() + 500; } } - sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&ft->pfts); + ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&ft->pfts); LOG("P2P: Finished sending file bytes."); _close(fid); } @@ -233,7 +233,7 @@ int CAimProto::sending_file(file_transfer *ft, HANDLE hServerPacketRecver, NETLI LOG("P2P: Buddy says they got the file successfully"); if ((ft->pfts.currentFileNumber + 1) < ft->pfts.totalFiles) { - sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_NEXTFILE, ft, 0); + ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, ACKRESULT_NEXTFILE, ft, 0); ++ft->pfts.currentFileNumber; ++ft->cf; if (!setup_next_file_send(ft)) @@ -264,7 +264,7 @@ int CAimProto::sending_file(file_transfer *ft, HANDLE hServerPacketRecver, NETLI if (Netlib_Send(ft->hConn, (char*)recv_ft, _htons(recv_ft->length), 0) <= 0) break; ft->pfts.totalProgress += ft->pfts.currentFileProgress; - sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&ft->pfts); + ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&ft->pfts); } } } @@ -355,7 +355,7 @@ int CAimProto::receiving_file(file_transfer *ft, HANDLE hServerPacketRecver, NET ft->pfts.tszCurrentFile = mir_tstrdup(fname); ResetEvent(ft->hResumeEvent); - if (sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_FILERESUME, ft, (LPARAM)&ft->pfts)) + if (ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, ACKRESULT_FILERESUME, ft, (LPARAM)&ft->pfts)) WaitForSingleObject(ft->hResumeEvent, INFINITE); if (ft->pfts.tszCurrentFile) @@ -389,7 +389,7 @@ int CAimProto::receiving_file(file_transfer *ft, HANDLE hServerPacketRecver, NET oft->type = _htons(0x0204); _close(fid); - sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_NEXTFILE, ft, 0); + ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, ACKRESULT_NEXTFILE, ft, 0); ++ft->pfts.currentFileNumber; ft->pfts.currentFileProgress = 0; } @@ -399,7 +399,7 @@ int CAimProto::receiving_file(file_transfer *ft, HANDLE hServerPacketRecver, NET { oft->type = _htons(0x0204); - sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_NEXTFILE, ft, 0); + ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, ACKRESULT_NEXTFILE, ft, 0); ++ft->pfts.currentFileNumber; ft->pfts.currentFileProgress = 0; } @@ -437,7 +437,7 @@ int CAimProto::receiving_file(file_transfer *ft, HANDLE hServerPacketRecver, NET _write(fid, packetRecv.buffer, packetRecv.bytesAvailable); ft->pfts.currentFileProgress += packetRecv.bytesAvailable; ft->pfts.totalProgress += packetRecv.bytesAvailable; - sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&ft->pfts); + ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&ft->pfts); if (ft->pfts.currentFileSize == ft->pfts.currentFileProgress) { oft->type = _htons(0x0204); @@ -456,7 +456,7 @@ int CAimProto::receiving_file(file_transfer *ft, HANDLE hServerPacketRecver, NET accepted_file = false; _close(fid); - sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_NEXTFILE, ft, 0); + ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, ACKRESULT_NEXTFILE, ft, 0); ++ft->pfts.currentFileNumber; ft->pfts.currentFileProgress = 0; } diff --git a/protocols/AimOscar/src/proto.cpp b/protocols/AimOscar/src/proto.cpp index 2d5758a93b..6f9815a8a7 100644 --- a/protocols/AimOscar/src/proto.cpp +++ b/protocols/AimOscar/src/proto.cpp @@ -365,15 +365,15 @@ void __cdecl CAimProto::basic_search_ack_success(void* p) { if (strlen(sn) > 32) { - sendBroadcast(NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE) 1, 0); + ProtoBroadcastAck(NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE) 1, 0); } else { PROTOSEARCHRESULT psr = {0}; psr.cbSize = sizeof(psr); psr.id = (TCHAR*)sn; - sendBroadcast(NULL, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE) 1, (LPARAM) & psr); - sendBroadcast(NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE) 1, 0); + ProtoBroadcastAck(NULL, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE) 1, (LPARAM) & psr); + ProtoBroadcastAck(NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE) 1, 0); } } mir_free(sn); @@ -554,7 +554,7 @@ void __cdecl CAimProto::msg_ack_success(void* param) msg_ack_param *msg_ack = (msg_ack_param*)param; Sleep(150); - sendBroadcast(msg_ack->hContact, ACKTYPE_MESSAGE, + ProtoBroadcastAck(msg_ack->hContact, ACKTYPE_MESSAGE, msg_ack->success ? ACKRESULT_SUCCESS : ACKRESULT_FAILED, (HANDLE)msg_ack->id, (LPARAM)msg_ack->msg); @@ -723,10 +723,10 @@ void __cdecl CAimProto::get_online_msg_thread(void* arg) const HANDLE hContact = arg; DBVARIANT dbv; if (!db_get_ts(hContact, MOD_KEY_CL, OTH_KEY_SM, &dbv)) { - sendBroadcast(hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, (HANDLE)1, (LPARAM)dbv.ptszVal); + ProtoBroadcastAck(hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, (HANDLE)1, (LPARAM)dbv.ptszVal); db_free(&dbv); } - else sendBroadcast(hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, (HANDLE)1, 0); + else ProtoBroadcastAck(hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, (HANDLE)1, 0); } HANDLE __cdecl CAimProto::GetAwayMsg(HANDLE hContact) @@ -753,7 +753,7 @@ HANDLE __cdecl CAimProto::GetAwayMsg(HANDLE hContact) int __cdecl CAimProto::RecvAwayMsg(HANDLE hContact, int statusMode, PROTORECVEVENT* pre) { - sendBroadcast(hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, (HANDLE)1, (LPARAM)pre->szMessage); + ProtoBroadcastAck(hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, (HANDLE)1, (LPARAM)pre->szMessage); return 0; } diff --git a/protocols/AimOscar/src/proto.h b/protocols/AimOscar/src/proto.h index 27cec08d83..5c8aa0bde9 100644 --- a/protocols/AimOscar/src/proto.h +++ b/protocols/AimOscar/src/proto.h @@ -492,8 +492,6 @@ struct CAimProto : public PROTO_INTERFACE void setTString(HANDLE hContact, const char* name, const TCHAR* value); void setWord(const char* name, WORD value); void setWord(HANDLE hContact, const char* name, WORD value); - - int sendBroadcast(HANDLE hContact, int type, int result, HANDLE hProcess, LPARAM lParam); }; #endif diff --git a/protocols/AimOscar/src/proxy.cpp b/protocols/AimOscar/src/proxy.cpp index ee7927adc7..f3cc734127 100644 --- a/protocols/AimOscar/src/proxy.cpp +++ b/protocols/AimOscar/src/proxy.cpp @@ -44,12 +44,12 @@ void __cdecl CAimProto::aim_proxy_helper(void* param) int recvResult = CallService(MS_NETLIB_GETMOREPACKETS, (WPARAM)hServerPacketRecver, (LPARAM)&packetRecv); if (recvResult == 0) { - sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); + ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); break; } if (recvResult == SOCKET_ERROR) { - sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); + ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); break; } if (recvResult > 0) @@ -100,7 +100,7 @@ void __cdecl CAimProto::aim_proxy_helper(void* param) ft->accepted = true; } - sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTED, ft, 0); + ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTED, ft, 0); int i; for (i = 21; --i; ) @@ -111,7 +111,7 @@ void __cdecl CAimProto::aim_proxy_helper(void* param) } if (i == 0) { - sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); + ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); break; } @@ -123,7 +123,7 @@ void __cdecl CAimProto::aim_proxy_helper(void* param) else result = receiving_file(ft, hServerPacketRecver, packetRecv); - sendBroadcast(ft->hContact, ACKTYPE_FILE, result ? ACKRESULT_FAILED : ACKRESULT_SUCCESS, ft, 0); + ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, result ? ACKRESULT_FAILED : ACKRESULT_SUCCESS, ft, 0); break; } } diff --git a/protocols/AimOscar/src/server.cpp b/protocols/AimOscar/src/server.cpp index 67af63c1f2..7c42ff979b 100644 --- a/protocols/AimOscar/src/server.cpp +++ b/protocols/AimOscar/src/server.cpp @@ -548,7 +548,7 @@ void CAimProto::snac_user_online(SNAC &snac)//family 0x0003 db_set_utf(hContact, MOD_KEY_CL, OTH_KEY_SM, msg_s); TCHAR* tszMsg = mir_utf8decodeT(msg_s); - sendBroadcast(hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, NULL, (LPARAM)tszMsg); + ProtoBroadcastAck(hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, NULL, (LPARAM)tszMsg); mir_free(tszMsg); mir_free(msg); mir_free(msg_s); @@ -1447,7 +1447,7 @@ void CAimProto::snac_received_message(SNAC &snac,HANDLE hServerConn,unsigned sho LOG("File transfer cancelled or denied."); file_transfer* ft = ft_list.find_by_cookie(icbm_cookie, hContact); - sendBroadcast(hContact, ACKTYPE_FILE, ACKRESULT_DENIED, ft, 0); + ProtoBroadcastAck(hContact, ACKTYPE_FILE, ACKRESULT_DENIED, ft, 0); ft_list.remove_by_ft(ft); } else if (rdz_msg_type == 2)//buddy accepts our file transfer request @@ -1511,7 +1511,7 @@ void CAimProto::snac_file_decline(SNAC &snac)//family 0x0004 file_transfer *ft = ft_list.find_by_cookie(icbm_cookie, hContact); if (ft) { - sendBroadcast(hContact, ACKTYPE_FILE, ACKRESULT_DENIED, ft, 0); + ProtoBroadcastAck(hContact, ACKTYPE_FILE, ACKRESULT_DENIED, ft, 0); if (ft->hConn) Netlib_Shutdown(ft->hConn); else ft_list.remove_by_ft(ft); } @@ -1944,13 +1944,13 @@ void CAimProto::snac_email_search_results(SNAC &snac)//family 0x000A offset+=TLV_HEADER_SIZE; psr.id = (TCHAR*)tlv.dup(); offset+=tlv.len(); - sendBroadcast(NULL, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE) 1, (LPARAM) & psr); + ProtoBroadcastAck(NULL, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE) 1, (LPARAM) & psr); mir_free(psr.nick); } - sendBroadcast(NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE) 1, 0); + ProtoBroadcastAck(NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE) 1, 0); } else // If no match, stop the search. - CAimProto::sendBroadcast(NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE) 1, 0); + CAimProto::ProtoBroadcastAck(NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE) 1, 0); } void CAimProto::snac_chatnav_info_response(SNAC &snac,HANDLE hServerConn,unsigned short &seqno)//family 0x000D @@ -2256,7 +2256,7 @@ void CAimProto::snac_admin_account_infomod(SNAC &snac)//family 0x0007 setString(AIM_KEY_EM,email); // Save our email for future reference. if (sn) setString(AIM_KEY_SN,sn); // Update the database to reflect the formatted name. - sendBroadcast( NULL, ACKTYPE_GETINFO, ACKRESULT_SUCCESS, (HANDLE)1, 0 ); + ProtoBroadcastAck( NULL, ACKTYPE_GETINFO, ACKRESULT_SUCCESS, (HANDLE)1, 0 ); } else if (snac.subcmp(0x0005) && !err) // Changed info diff --git a/protocols/AimOscar/src/thread.cpp b/protocols/AimOscar/src/thread.cpp index e8044f90d2..60f16f5263 100644 --- a/protocols/AimOscar/src/thread.cpp +++ b/protocols/AimOscar/src/thread.cpp @@ -86,7 +86,7 @@ void __cdecl CAimProto::accept_file_thread(void* param)//buddy sending file { aim_file_ad(hServerConn, seqno, ft->sn, ft->icbm_cookie, true, 0); } - sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); + ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0); ft_list.remove_by_ft(ft); } } diff --git a/protocols/AimOscar/src/utility.cpp b/protocols/AimOscar/src/utility.cpp index 77c3960acd..f43e88aa63 100644 --- a/protocols/AimOscar/src/utility.cpp +++ b/protocols/AimOscar/src/utility.cpp @@ -82,7 +82,7 @@ void CAimProto::broadcast_status(int status) admin_seqno = 0; } - sendBroadcast(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)old_status, m_iStatus); + ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)old_status, m_iStatus); } void CAimProto::start_connection(void *arg) @@ -805,11 +805,6 @@ void CAimProto::setWord(HANDLE hContact, const char* name, WORD value) { db_set_w(hContact, m_szModuleName, name, value); } -int CAimProto::sendBroadcast(HANDLE hContact, int type, int result, HANDLE hProcess, LPARAM lParam) -{ - return ProtoBroadcastAck(m_szModuleName, hContact, type, result, hProcess, lParam); -} - ///////////////////////////////////////////////////////////////////////////////////////// void CAimProto::CreateProtoService(const char* szService, AimServiceFunc serviceProc) -- cgit v1.2.3