/* Copyright (C) 2021-2024 Free Software Foundation, Inc.
   Contributed by Oracle.

   This file is part of GNU Binutils.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#ifndef _DBE_H_
#define _DBE_H_

#include <stdio.h>
#include "enums.h"

class MetricList;
template <class ITEM> class Vector;
typedef long long Obj;

Vector<char*> *dbeGetInitMessages (void);
Vector<char*> *dbeGetExpPreview (int dbevindex, char *exp_name);
char *dbeGetExpParams (int dbevindex, char *exp_name);
char *dbeCreateDirectories (const char *dirname);
char *dbeDeleteFile (const char *pathname);
Vector<char*> *dbeReadFile (const char *pathname);
int dbeWriteFile (const char *pathname, const char *contents);
char *dbeGetFileAttributes (const char *filename, const char *format);
char *dbeGetFiles (const char *dirname, const char *format);
char *dbeGetRunningProcesses (const char *format);
char *dbeOpenExperimentList (int dbevindex, Vector<Vector<char*>*> *groups,
			     bool sessionRestart);
char *dbeReadRCFile (int dbevindex, char* path);
char *dbeSetExperimentsGroups (Vector<Vector<char*>*> *groups);
Vector<Vector<char*>*> *dbeGetExperimensGroups ();
char *dbeDropExperiment (int dbevindex, Vector<int> *drop_index);
Vector<char*> *dbeGetExpsProperty (const char *prop_name);
Vector<char*> *dbeGetExpName (int dbevindex);
Vector<int> *dbeGetExpState (int dbevindex);
Vector<bool> *dbeGetExpEnable (int dbevindex);
bool dbeSetExpEnable (int dbevindex, Vector<bool> *enable);
Vector<char*> *dbeGetExpInfo (int dbevindex);
bool dbeGetViewModeEnable ();
bool dbeGetJavaEnable ();
int dbeUpdateNotes (int dbevindex, int exp_id, int type, char* text,
		    bool handle_file);
Vector<void*> *dbeGetTabListInfo (int dbevindex);
Vector<bool> *dbeGetTabSelectionState (int dbevindex);
void dbeSetTabSelectionState (int dbevindex, Vector<bool> *selected);
Vector<bool> *dbeGetMemTabSelectionState (int dbevindex);
void dbeSetMemTabSelectionState (int dbevindex, Vector<bool> *selected);
Vector<bool> *dbeGetIndxTabSelectionState (int dbevindex);
void dbeSetIndxTabSelectionState (int dbevindex, Vector<bool> *selected);
Vector<char*> *dbeGetLoadObjectName (int dbevindex);
Vector<void *> *dbeGetLoadObjectList (int dbevindex);
Vector<char*> *dbeGetSearchPath (int dbevindex);
void dbeSetSearchPath (int dbevindex, Vector<char*> *path);
Vector<void*> *dbeGetPathmaps (int dbevindex);
char *dbeSetPathmaps (Vector<char*> *from, Vector<char*> *to);
char *dbeAddPathmap (int dbevindex, char *from, char *to);
char *dbeGetMsg (int dbevindex, int type);
int dbeInitView (int index, int cloneindex);
void dbeDeleteView (int dbevindex);

//	methods concerning metrics
MetricList *dbeGetMetricListV2 (int dbevindex, MetricType mtype,
				Vector<int> *type, Vector<int> *subtype,
				Vector<bool> *sort, Vector<int> *vis,
				Vector<char*> *aux, Vector<char*> *expr_spec,
				Vector<char*> *legends);
Vector<void*> *dbeGetRefMetricsV2 ();
Vector<void*> *dbeGetCurMetricsV2 (int dbevindex, MetricType mtype);
void dbeSetSort (int dbevindex, int sort_index, MetricType mtype, bool reverse);

//	methods concerning metrics for Overview Tab
Vector<void*> *dbeGetRefMetricTree (int dbevindex, bool include_unregistered);
Vector<void*> *dbeGetRefMetricTreeValues (int dbevindex, Vector<char *> *met_cmds,
					  Vector<char *> *non_met_cmds);
Vector<char*> *dbeGetOverviewText (int dbevindex);
Vector<int> *dbeGetAnoValue (int dbevindex);
void dbeSetAnoValue (int dbevindex, Vector<int> *set);
int dbeGetNameFormat (int dbevindex);
bool dbeGetSoName (int dbevindex);
void dbeSetNameFormat (int dbevindex, int fnames, bool soname);
int dbeGetViewMode (int dbevindex);
void dbeSetViewMode (int dbevindex, int nmode);
Vector<void*> *dbeGetTLValue (int dbevindex);
void dbeSetTLValue (int dbevindex, const char *tldata_cmd,
		    int entitiy_prop_id, int stackalign, int stackdepth);
Vector<void*> *dbeGetExpFounderDescendants ();
Vector<void*> *dbeGetExpSelection (int dbevindex);
Vector<void*> *dbeGetSampleStatus (int dbevindex, int nselected,
				   Vector<bool> *selected);
Vector<unsigned> *dbeGetSampleSize (int dbevindex, Vector<bool> *selected);
char *dbeCheckPattern (int dbevindex, Vector<bool> *selected, char *pattern,
		       int type);
char *dbeSetFilterStr (int dbevindex, char *filter_str);
char *dbeGetFilterStr (int dbevindex);
int dbeValidateFilterExpression (char *str_expr);
Vector<void*> *dbeGetFilterKeywords (int dbevindex);
Vector<void*> *dbeGetFilters (int dbevindex, int nexp);
bool dbeUpdateFilters (int dbevindex, Vector<bool> *selected,
		       Vector<char*> *pattern_str);
char *dbeComposeFilterClause (int dbevindex, int type, int subtype,
			      Vector<int>*selections);
Vector<int> *dbeGetLoadObjectState (int dbevindex);
void dbeSetLoadObjectState (int dbevindex, Vector<int> *selected);
void dbeSetLoadObjectDefaults (int dbevindex);
Vector<void*> *dbeGetMemObjects (int dbevindex);
char *dbeDefineMemObj (char *name, char *index_expr, char *_machmodel,
		       char *sdesc, char *ldesc);
char *dbeDeleteMemObj (char *name);
Vector<char*> *dbeGetCPUVerMachineModel (int dbevindex);
char *dbeLoadMachineModel (char *name);
char *dbeGetMachineModel ();
Vector<char*> *dbeListMachineModels ();
void dbeDetectLoadMachineModel (int dbevindex);
Vector<void*> *dbeGetIndxObjDescriptions (int dbevindex);
Vector<void*> *dbeGetCustomIndxObjects (int dbevindex);
char *dbeDefineIndxObj (char *name, char *index_expr, char *sdesc, char *ldesc);
void dbeSetSelObj (int dbevindex, Obj sel_obj, int type, int subtype);
void dbeSetSelObjV2 (int dbevindex, uint64_t id);
Obj dbeGetSelObj (int dbevindex, int type, int subtype);
uint64_t dbeGetSelObjV2 (int dbevindex, char *typeStr);
int dbeGetSelIndex (int dbevindex, Obj sel_obj, int type, int subtype);
Vector<uint64_t> *dbeGetSelObjsIO (int dbevindex, Vector<uint64_t> *ids, int type);
Vector<uint64_t> *dbeGetSelObjIO (int dbevindex, uint64_t id, int type);
uint64_t dbeGetSelObjHeapTimestamp (int dbevindex, uint64_t id);
int dbeGetSelObjHeapUserExpId (int dbevindex, uint64_t id);
char *dbeSetPrintLimit (int dbevindex, int limit);
int dbeGetPrintLimit (int dbevindex);
char *dbeSetPrintMode (int dbevindex, char *printmode);
int dbeGetPrintMode (int dbevindex);
char *dbeGetPrintModeString (int dbevindex);
char dbeGetPrintDelim (int dbevindex);
Vector<void*> *dbeGetTotals (int dbevindex, int dsptype, int subtype);
Vector<void*> *dbeGetHotMarks (int dbevindex, int type);
Vector<void*> *dbeGetHotMarksInc (int dbevindex, int type);
Vector<void*> *dbeGetSummaryHotMarks (int dbevindex, Vector<Obj> *sel_objs, int type);
Vector<uint64_t> *dbeGetFuncId (int dbevindex, int type, int begin, int length);
Vector<void*> *dbeGetFuncCalleeInfo (int dbevindex, int type, Vector<int>* idxs, int groupId);
Vector<void*> *dbeGetFuncCallerInfo (int dbevindex, int type, Vector<int>* idxs, int groupId);
Vector<void*> *dbeGetFuncCalleeInfoById (int dbevindex, int type, int idx);
Vector<void*> *dbeGetFuncCallerInfoById (int dbevindex, int type, int idx);
char *dbePrintData (int dbevindex, int type, int subtype, char *printer,
		    char *fname, FILE *outfile);
int dbeSetFuncData (int dbevindex, Obj sel_obj, int type, int subtype);
Vector<void*> *dbeGetFuncList (int dbevindex, int type, int subtype);
Vector<void*> *dbeGetFuncListV2 (int dbevindex, int mtype, Obj sel_obj, int type, int subtype);
Vector<void*> *dbeGetFuncListMini (int dbevindex, int type, int subtype);
Vector<Obj> *dbeGetComparableObjsV2 (int dbevindex, Obj sel_obj, int type);
Obj dbeConvertSelObj (Obj obj, int type);
Vector<int> *dbeGetGroupIds (int dbevindex);
Vector<void*> *dbeGetTableDataV2 (int dbevindex, char *mlistStr, char *modeStr,
				  char *typeStr, char *subtypeStr, Vector<uint64_t> *ids);

int dbeGetCallTreeNumLevels (int dbevindex);
Vector<void*> *dbeGetCallTreeLevel (int dbevindex, char *mcmd, int level);
Vector<void*> *dbeGetCallTreeLevels (int dbevindex, char *mcmd);
Vector<void*> *dbeGetCallTreeChildren (int dbevindex, char *mcmd, Vector<int /*NodeIdx*/>*nodes);
Vector<void*> *dbeGetCallTreeLevelFuncs (int dbevindex, int level_start, int level_end);
Vector<void*> *dbeGetCallTreeFuncs (int dbevindex);
Vector<char*> *dbeGetNames (int dbevindex, int type, Obj sel_obj);
Vector<void*> *dbeGetTotalMax (int dbevindex, int type, int subtype);
Vector<void*> *dbeGetStatisOverviewList (int dbevindex);
Vector<void*> *dbeGetStatisList (int dbevindex);
Vector<void*> *dbeGetSummary (int dbevindex, Vector<Obj> *objs, int type, int subtype);
Vector<void*> *dbeGetSummaryV2 (int dbevindex, Vector<Obj> *objs, int type, int subtype);
Vector<int> *dbeGetFounderExpId (Vector<int> *expIds);
Vector<int> *dbeGetUserExpId (Vector<int> *expIds); // filter "user visible" experiment id
Vector<int> *dbeGetExpGroupId (Vector<int> *expIds);
char *dbeGetExpName (int dbevindex, char *dir_name);
Vector<char*> *dbeGetHwcHelp (int dbevindex, bool forKernel);
Vector<Vector<char*>*> *dbeGetHwcSets (int dbevindex, bool forKernel);
Vector<void*> *dbeGetHwcsAll (int dbevindex, bool forKernel);
Vector<char*> *dbeGetHwcAttrList (int dbevindex, bool forKernel);
int dbeGetHwcMaxConcurrent (int dbevindex, bool forKernel);
int dbeGetHwcMaxReg (int dbevindex); // TBR?

Vector<char*> *dbeGetIfreqData (int dbevindex);
Vector<void*> *dbeGetLeakListInfo (int dbevindex, bool leakflag);
Vector<void*> *dbeMpviewGetTlFuncReps (int dbevindex, int exp_id,
				       long long binSizeTime, long long startTime, long long endTime,
				       long long binSizeRank, long long startRank, long long endRank);
Vector<void*> *dbeMpviewGetTlMsgReps (int dbevindex, int exp_id, int throttle,
				      long long binSizeTime, long long startTime, long long endTime,
				      long long binSizeRank, long long startRank, long long endRank);
Vector<long long> *dbeMpviewGetAxisRange (int dbevindex, int exp_id,
					  int chart_type, int axis_type);
Vector<char*> *dbeMpviewGetAxisDiscreteLabels (int dbevindex, int exp_id,
					       int chart_type, int axis_type);
Vector<void*> *dbeMpviewGetFuncDetails (int dbevindex, int exp_id, Obj funcId);
Vector<void*> *dbeMpviewGetMesgDetails (int dbevindex, int exp_id, Obj mesgId);
Vector<long long> *dbeMpviewGetChartData (int dbevindex, int exp_id, int ctype,
					  int attr1, long long start1,
					  long long end1, int nbins1,
					  int attr2, long long start2,
					  long long end2, int nbins2,
					  int metric, int reduction);
void dbeMpviewFilterSet (int dbevindex, int exp_id, Vector<int> *ctid,
			 Vector<int > *axid, Vector<long long> *startVal,
			 Vector<long long> *endVal);
void dbeMpviewLoadStacks (int dbevindex, int exp_id);


Obj dbeGetObject (int dbevindex, Obj sel_func, Obj sel_pc);
char *dbeGetName (int dbevindex, int exp_id);
Vector<char*> *dbeGetExpVerboseName (Vector<int> *exp_ids);
long long dbeGetStartTime (int dbevindex, int exp_id);
long long dbeGetRelativeStartTime (int dbevindex, int exp_id);
long long dbeGetEndTime (int dbevindex, int exp_id);
int dbeGetClock (int dbevindex, int exp_id);
long long dbeGetWallStartSec (int dbevindex, int exp_id);
char *dbeGetHostname (int dbevindex, int exp_id);
Vector<void*> *dbeGetEntityProps (int dbevindex);
Vector<void*> *dbeGetEntities (int dbevindex, int exp_id, int ekind);
Vector<void*> *dbeGetEntitiesV2 (int dbevindex, Vector<int> *exp_ids, int ekind);
Vector<void*> *dbeGetTLDetails (int dbevindex, int exp_id, int data_id,
				int entity_prop_id, Obj event_id);
Vector<Obj> *dbeGetStackFunctions (int dbevindex, Obj stack);
Vector<void*> *dbeGetStacksFunctions (int dbevindex, Vector<Obj> *stacks);
Vector<Obj> *dbeGetStackPCs (int dbevindex, Obj stack);
Vector<char*> *dbeGetStackNames (int dbevindex, Obj stack);
Vector<void*> *dbeGetSamples (int dbevindex, int exp_id, int64_t lo, int64_t hi);
Vector<void*> *dbeGetGCEvents (int dbevindex, int exp_id, int64_t lo, int64_t hi);
Vector<Vector<char*>*>* dbeGetIOStatistics (int dbevindex);
Vector<Vector<char*>*>* dbeGetHeapStatistics (int dbevindex);
Vector<char*> *dbeGetFuncNames (int dbevindex, Vector<Obj> *funcs);
Vector<char*> *dbeGetObjNamesV2 (int dbevindex, Vector<uint64_t> *ids);
char *dbeGetFuncName (int dbevindex, Obj func);
char *dbeGetObjNameV2 (int dbevindex, uint64_t id);
Vector<uint64_t> *dbeGetFuncIds (int dbevindex, Vector<Obj> *funcs);
uint64_t dbeGetFuncId (int dbevindex, Obj func);
char *dbeGetDataspaceTypeDesc (int dbevindex, Obj stack);
Vector<void*> *dbeGetDataDescriptorsV2 (int exp_id);
Vector<void*> *dbeGetDataPropertiesV2 (int exp_id, int data_id);
Vector<void*> *dbeGetExperimentTimeInfo (Vector<int> *exp_ids);
Vector<void*> *dbeGetExperimentDataDescriptors (Vector<int> *exp_ids);

/*   New Timeline Interface */
Vector<long long> *dbeGetAggregatedValue (int data_id, char *lfilter, char *fexpr,
					  char *pname_ts, hrtime_t start_ts,
					  hrtime_t delta, int num,
					  char *pname_key, char *aggr_func);
Vector<char*> *dbeGetLineInfo (Obj pc);
int dbeSetAlias (char *name, char *uname, char *expr);
Vector<char*> *dbeGetAlias (char *name);
Vector<Vector<long long>*> *dbeGetXYPlotData (int data_id, char *lfilter,
					      char *arg, char *func1, char *aggr1,
					      char *func2, char *aggr2,
					      char *func3, char *aggr3);
Vector<bool> *dbeHasTLData (int dbev_index, Vector<int> *exp_ids,
			    Vector<int> *data_ids, // DATA_*
			    Vector<int> *entity_prop_ids, // LWP,CPU,THR, etc
			    Vector<int> *entity_prop_values,
			    Vector<int> *auxs);
Vector<void*> *dbeGetTLData (int dbevindex, int exp_id, int data_id,
			     int entity_prop_id, int entity_prop_val, int aux,
			     hrtime_t start_ts, hrtime_t delta, int num,
			     bool getRepresentatives, Vector<char*> *chartProperties);
Vector<long long> *dbeGetTLEventCenterTime (int dbevindex, int exp_id,
					    int data_id, int entity_prop_id,
					    int entity_prop_val, int aux,
					    long long event_idx, long long move_count);
long long dbeGetTLEventIdxNearTime (int dbevindex, int exp_id,
				    int data_id,
				    int entity_prop_id, int entity_prop_val, int aux,
				    int searchDirection,
				    long long timestamp);

/*   Interface for use by Collector GUI */
int dbeGetSignalValue (char *);
char *dbeSendSignal (pid_t, int);
char *dbeGetCollectorControlValue (char *);
char *dbeSetCollectorControlValue (char *, char *);
char *dbeUnsetCollectorControlValue (char *);
char *dbeCheckConnection (char *);
void dbe_archive (Vector<long long> *ids, Vector<const char *> *locations);
void dbeSetLocation (const char *fname, const char *location);
void dbeSetLocations (Vector<const char *> *fnames, Vector<const char *> *locations);
Vector<void*> *dbeResolvedWith_setpath (const char *path);
Vector<void*> *dbeResolvedWith_pathmap (const char *old_prefix, const char *new_prefix);

#endif /* _DBE_H_ */
